我在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的继承行为吗?
答案 0 :(得分:1)
我想这只是一个最小的例子,Child对于Parent的子类没有多大意义。我希望它们都是Person的子类,或类似的东西。在这种情况下,您可能也想看看多态身份。
无论如何,SQLAlchemy继承不能像那样工作。在您声明的方式中,它期望您的Child
类和表声明它自己的主键,因为它是一个单独的表,但如果您尝试使用相同的属性名称,则会发生冲突。尝试使用sqlalchemy.orm.column_property
声明基本id列,它应该按预期执行。
所以,在Child上做这样的事情:
id = sqlalchemy.orm.column_property(Column(INT, primary_key=True), Parent.id)
它应该像你期望的那样工作。