SqlAlchemy表继承和主键

时间:2015-04-16 19:01:41

标签: python mysql inheritance sqlalchemy primary-key

我在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的继承行为吗?

1 个答案:

答案 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)

它应该像你期望的那样工作。