SQLAlchemy 如何为相同的 table 定义两个模型
SQLAlchemy how to define two models for the same table
我有一个 table,其中一列是具有两个值的 varchar ('groupA','groupB')
当我创建我的模型时,我想实现两件事:
- A 组模型 - 包含 X 数量的相关功能
- groupB 的模型 - 包含 Y 数量的相关函数
两个模型的功能不一样,尽管它们代表 相同 table:
class GroupA(Base):
__tablename__ = 'groups'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(80))
group_type = Column('type', String(15), default="groupA")
对于组 B:
class GroupB(Base):
__tablename__ = 'groups'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(80))
group_type = Column('type', String(15), default="groupB")
所以 GroupA 和 B 是一样的table: "groups", 但是 GroupA 有 100 行,groupB 有 20 行
我想防止一直写这个:
session.query(GroupA).filter(group_type = 'groupA')
session.query(GroupB).filter(group_type = 'groupB')
我如何使用某种“fitler”配置我的模型,当我 query.all() 时,它将 return 每个模型的数据相关?现在,无论我查询哪个模型,我都会收到两个模型的所有数据...
提前致谢。
根据答案编辑解决方案
要使用继承,我必须将整个结构更改为
class Group(Base):
id = Column('id', Integer, primary_key=True)
name = Column('name', String(80))
group_type = Column('type', String(15))
__mapper_args__ = {
'polymorphic_on': g_type,
'polymorphic_identity': 'Group'
}
# Replacing Base => Group
class GroupA(Group):
__mapper_args__ = {
'polymorphic_identity': 'GroupA'
}
class GroupB(Group):
__mapper_args__ = {
'polymorphic_identity': 'GroupB'
}
它正在运行,非常感谢!
Single Table Inheritance 是您所需要的。将您的 group_type
定义为多态身份,一切就绪。
我有一个 table,其中一列是具有两个值的 varchar ('groupA','groupB')
当我创建我的模型时,我想实现两件事:
- A 组模型 - 包含 X 数量的相关功能
- groupB 的模型 - 包含 Y 数量的相关函数
两个模型的功能不一样,尽管它们代表 相同 table:
class GroupA(Base):
__tablename__ = 'groups'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(80))
group_type = Column('type', String(15), default="groupA")
对于组 B:
class GroupB(Base):
__tablename__ = 'groups'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(80))
group_type = Column('type', String(15), default="groupB")
所以 GroupA 和 B 是一样的table: "groups", 但是 GroupA 有 100 行,groupB 有 20 行
我想防止一直写这个:
session.query(GroupA).filter(group_type = 'groupA')
session.query(GroupB).filter(group_type = 'groupB')
我如何使用某种“fitler”配置我的模型,当我 query.all() 时,它将 return 每个模型的数据相关?现在,无论我查询哪个模型,我都会收到两个模型的所有数据...
提前致谢。
根据答案编辑解决方案
要使用继承,我必须将整个结构更改为
class Group(Base):
id = Column('id', Integer, primary_key=True)
name = Column('name', String(80))
group_type = Column('type', String(15))
__mapper_args__ = {
'polymorphic_on': g_type,
'polymorphic_identity': 'Group'
}
# Replacing Base => Group
class GroupA(Group):
__mapper_args__ = {
'polymorphic_identity': 'GroupA'
}
class GroupB(Group):
__mapper_args__ = {
'polymorphic_identity': 'GroupB'
}
它正在运行,非常感谢!
Single Table Inheritance 是您所需要的。将您的 group_type
定义为多态身份,一切就绪。