【发布时间】:2018-03-10 08:59:54
【问题描述】:
情况: 我有一个包含几列的数据表“my_table”(我们称它们为“a”、“b”和“c”)。
使用 SQLAlchemy,我在我的模型中创建了 3 个类:
class MyTableBase():
a = Column(int)
class MyClassOne(MyTableBase):
b = Column(int)
class MyObjectTwo(MyTableBase):
c = Column(int)
我想覆盖默认的 query(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 表有两条记录 - 一条的值为“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 类中获取列(列 c 不在 SELECT 语句中),但它仍然缺少 WHERE 部分。
【问题讨论】:
-
使用
a作为鉴别器列,如Mapping Class Inheritance Hierarchies 中所述。您尝试执行的操作类似于 single table inheritance。 -
您能否展示您实际用于从表中插入和拉出行的代码以及实际模型?对于初学者, MyTableBase.a 被定义为一个整数,但您的多态身份是字符串。如果您想将 MyClassOne 定义为表中 a=10 的所有记录,则该模型的 polymorphic_identity 应为 10。
-
这部分很好。 var a 现在是 Column(VARCHAR(length=20)) - 这是我在缩短源代码时的错误。我所做的只是 cls_query = Session.query(MyClassA)。它返回正确的 SQL,但不幸的是没有 WHERE a = identity_value。
-
请检查更新。非常感谢!
-
您能提供完整的 MCVE 吗?例如您的查询是针对不存在的类“MyObjectOne”。针对子类的单表继承查询将自动添加 WHERE 子句。如果您没有看到,需要完整的可运行演示。
标签: python sqlalchemy