Python 具有多态_标识的SQLAlchemy单表继承缺少WHERE

Python 具有多态_标识的SQLAlchemy单表继承缺少WHERE,python,sqlalchemy,Python,Sqlalchemy,情况: 我有一个数据表“my_table”,其中有几列(我们称它们为“a”、“b”和“c”) 使用SQLAlchemy,我在模型中创建了3个类: class MyTableBase(): a = Column(int) class MyClassOne(MyTableBase): b = Column(int) class MyObjectTwo(MyTableBase): c = Column(int) 我想重写默认查询(MyClassOne).all()只

情况: 我有一个数据表“my_table”,其中有几列(我们称它们为“a”、“b”和“c”)

使用SQLAlchemy,我在模型中创建了3个类:

class MyTableBase():
     a = Column(int)

class MyClassOne(MyTableBase):
     b = Column(int)

class MyObjectTwo(MyTableBase):
     c = Column(int)
我想重写默认查询(MyClassOne).all()只返回a=10的记录,而query(MyClassTwo).all()只返回a=20的记录

这将提供一种非常优雅的方式,在一个表中存储许多不同(但非常相似)类型的对象,同时在类/对象级别分别处理它们

有什么建议吗?也许是我缺乏搜索技能,但就是找不到:/

更新

我现在的代码:

class MyTableBase: 
    __tablename__ = u'my_table_base'
    a = Column(VARCHAR(length=20)) #to distinct different types
    __mapper_args__ = {"polymorphic_on": a} 

class MyClassOne(MyTableBase): 
    __mapper_args__ = {"polymorphic_identity": "aaaa"} 
    b = Column(int)

class MyClassTwo(MyTableBase): 
    __mapper_args__ = {"polymorphic_identity": "bbbb"} 
    c = Column(int)
我的DB表有两条记录——一条在“a”列中的值为“aaaa”,另一条为“bbbb”。查询MyClassOne和MyClassTwo将返回这两行。有什么想法吗

更新: 要选择我使用的数据,请执行以下操作:

cls_query = Session.query(MyClassOne)
print 'cls_query: ',cls_query
cls_query.all()
打印结果为:

cls_query: SELECT my_table_base.id AS my_table_base_id,
my_table_base.a AS my_table_base_a,
my_table_base.b AS my_table_base_b
FROM my_table_base
请注意,它只从必需的类MyClassOne中获取列(SELECT语句中不存在c列),但仍然缺少WHERE部分。

如下所示:

在所有子类中,正确答案是\uuuuuu tablename\uuuu=None

class MyTableBase: 
    __tablename__ = u'my_table_base'
    a = Column(VARCHAR(length=20)) #to distinct different types
    __mapper_args__ = {"polymorphic_on": a} 

class MyClassOne(MyTableBase):
    __tablename__ = None
    __mapper_args__ = {"polymorphic_identity": "aaaa"} 
    b = Column(int)

class MyClassTwo(MyTableBase): 
    __tablename__ = None
    __mapper_args__ = {"polymorphic_identity": "bbbb"} 
    c = Column(int)
相关SQLAlchemy文档中没有此信息:(


现在可以正常工作了!

使用
a
作为鉴别器列,如中所述。您尝试执行的操作如下所示。能否显示您实际用于插入行并从表中拉出行的代码以及实际的模型?对于初学者,请使用MyTableBase。a定义为整数,但多态标识为字符串。如果需要若要将MyClassOne定义为表中a=10的所有记录,则该模型的多态性_标识应为10。这一部分很好。var a现在是一列(VARCHAR(length=20))-缩短源代码是我的错误。我所做的只是cls_query=Session.query(MyClassA)。它返回正确的SQL,但不幸的是没有WHERE a=identity\u值。请检查更新。非常感谢!您能提供完整的MCVE吗?例如,您的查询针对的是不存在的类“MyObjectOne”。对子类的单个表继承查询将自动添加WHERE子句。如果您没有看到,则需要完整的可运行演示。如下所述:还有另一种方法可以使用
@declared\u attr