我在 SqlAlchemy 中有一个继承表,它提示没有主键。奇怪的是,父表有一个主键。这是情况:
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'))
请注意,父表有一个主键,子表继承了它。尽管有此设置,我还是收到以下错误:
SAWarning: Could not assemble any primary keys for locally mapped table 'children' - no rows will be persisted in this Table.
self._configure_pks()
我不明白为什么SA不承认表确实有主键。有谁知道这里发生了什么?我是不是误解了SA的继承行为?
最佳答案
我想这只是一个最小的例子,Child 是 Parent 的子类没有多大意义。我希望两者都是 Person 的子类,或者类似的东西。在这种情况下,您可能还想看看多态身份。
无论如何,SQLAlchemy 继承不是那样工作的。在您声明的方式中,它期望您的 Child
类和表声明自己的主键,因为它是一个单独的表,但是如果您尝试使用相同的属性名称来执行此操作,您将得到一个冲突。尝试使用 sqlalchemy.orm.column_property
声明基本 id 列,它应该可以达到您的预期。
所以,对 Child 做这样的事情:
id = sqlalchemy.orm.column_property(Column(INT, primary_key=True), Parent.id)
它应该会像您预期的那样工作。
关于python - SqlAlchemy 表继承和主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29683751/