SQLAlchemy如何为同一个表定义两个模型

时间:2015-02-08 12:24:17

标签: python sqlalchemy

我有一个表,其中一列是带有两个值的varchar(' groupA',' groupB')

当我创建模型时,我想实现两件事:

  1. groupA的模型 - 保存X个相关函数
  2. groupB的模型 - 包含Y量的相关函数
  3. 这两个模型的功能并不相同,但它们代表相同的表:

    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")
    

    对于groupB:

    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是相同的表:" groups",但GroupA有100行,groupB有20行

    我想阻止一直写这个:

    session.query(GroupA).filter(group_type = 'groupA')
    session.query(GroupB).filter(group_type = 'groupB')
    

    如何使用某种" fitler"来配置我的模型?当我查询.all()时,它会返回每个模型的数据相关性吗?现在,无论我查询哪种型号,我都会收到两种型号的所有数据......

    提前致谢。

    使用基于答案的解决方案编辑

    要使用继承,我必须将整个结构更改为

    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'
       }
    

    它正在工作,非常感谢你!

1 个答案:

答案 0 :(得分:2)

Single Table Inheritance就是您所需要的。将您的group_type定义为多态身份,然后全部设置。