【问题标题】:SQLAlchemy Single Table Inheritance with polymorphic_identity lacks WHERE具有 polymorphic_identity 的 SQLAlchemy 单表继承缺少 WHERE
【发布时间】: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


【解决方案1】:

在这里找到: 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 文档中没有此信息:(

现在工作正常!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2010-11-23
  • 2011-08-09
相关资源
最近更新 更多