Python 具有多态_标识的SQLAlchemy单表继承缺少WHERE
情况: 我有一个数据表“my_table”,其中有几列(我们称它们为“a”、“b”和“c”) 使用SQLAlchemy,我在模型中创建了3个类: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()只
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