SqlAlchemy table 继承和主键
SqlAlchemy table inheritance and primary keys
我在 SqlAlchemy 中继承了 table,它抱怨没有主键。奇怪的是,父 table 有一个主键。情况是这样的:
Parent(Base)
__tablename__= 'parents'
id = Column(INT, primary_key=True, autoincrement=True)
Child(Parent)
__tablename__= 'children'
birthday = Column(TIMESTAMP)
parentId = Column(INT, ForeignKey('parents.uid', onupdate="CASCADE", ondelete="CASCADE"))
parent = relationship("User", backref=backref('CommandsQueued'))
请注意,父项 table 有一个主键,子项 table 继承了该主键。尽管有此设置,我还是收到以下错误:
SAWarning: Could not assemble any primary keys for locally mapped table 'children' - no rows will be persisted in this Table.
self._configure_pks()
我不明白为什么 SA 不承认 table 确实有主键。有谁知道这里发生了什么?我是不是误解了SA的继承行为?
我想这只是一个最小的例子,Child 成为 Parent 的子class 没有多大意义。我希望两者都是 Person 的子classes,或者类似的东西。在那种情况下,您可能还想看看多态标识。
无论如何,SQLAlchemy 继承不是那样工作的。在您声明的方式中,它期望您的 Child
class 和 table 声明自己的主键,因为它是一个单独的 table,但是如果您尝试使用相同的属性名称,你会得到一个冲突。尝试使用 sqlalchemy.orm.column_property
声明基本 ID 列,它应该可以达到您的预期。
所以,在 Child 上做这样的事情:
id = sqlalchemy.orm.column_property(Column(INT, primary_key=True), Parent.id)
它应该会像您预期的那样工作。
我在 SqlAlchemy 中继承了 table,它抱怨没有主键。奇怪的是,父 table 有一个主键。情况是这样的:
Parent(Base)
__tablename__= 'parents'
id = Column(INT, primary_key=True, autoincrement=True)
Child(Parent)
__tablename__= 'children'
birthday = Column(TIMESTAMP)
parentId = Column(INT, ForeignKey('parents.uid', onupdate="CASCADE", ondelete="CASCADE"))
parent = relationship("User", backref=backref('CommandsQueued'))
请注意,父项 table 有一个主键,子项 table 继承了该主键。尽管有此设置,我还是收到以下错误:
SAWarning: Could not assemble any primary keys for locally mapped table 'children' - no rows will be persisted in this Table.
self._configure_pks()
我不明白为什么 SA 不承认 table 确实有主键。有谁知道这里发生了什么?我是不是误解了SA的继承行为?
我想这只是一个最小的例子,Child 成为 Parent 的子class 没有多大意义。我希望两者都是 Person 的子classes,或者类似的东西。在那种情况下,您可能还想看看多态标识。
无论如何,SQLAlchemy 继承不是那样工作的。在您声明的方式中,它期望您的 Child
class 和 table 声明自己的主键,因为它是一个单独的 table,但是如果您尝试使用相同的属性名称,你会得到一个冲突。尝试使用 sqlalchemy.orm.column_property
声明基本 ID 列,它应该可以达到您的预期。
所以,在 Child 上做这样的事情:
id = sqlalchemy.orm.column_property(Column(INT, primary_key=True), Parent.id)
它应该会像您预期的那样工作。