具有polymorphic_identity的SQLAlchemy单表继承缺少WHERE

时间:2018-03-06 10:52:56

标签: 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(),只返回a = 10和查询(MyClassTwo).all()的记录,只返回a = 20的记录。 / p>

这应该提供非常优雅的方式来在一个表中存储许多不同(但非常相似)的对象,同时在类/对象级别单独播放它们。

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

更新

我的代码现在:

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)

我的数据库表有两条记录 - 一条记录的值为“aaaa”,另一条记录的“bbbb”记录在“a”列中。查询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部分。

1 个答案:

答案 0 :(得分:0)

如此处所示: Flask-SQLAlchemy Single Table Inheritance

所有子类中的正确答案是 __ tablename__ = 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文档中不存在此信息:(

现在工作正常!