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)

它应该会像您预期的那样工作。