python - SqlAlchemy 表继承和主键

标签 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的继承行为?

最佳答案

我想这只是一个最小的例子,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/

相关文章:

php - sql mysql查询,用于根据条件随机获取定义数量的行

c# - 使用通用约束时如何使用继承

Python 性能 : remove item from list

python - 如何使用其依赖项来 pickle python 函数?

php - 在 PHP 中对数组的所有值使用通用 if 语句

php - 创建可人工输入的、非顺序的唯一 ID 的良好做法

python - 在 PySimpleGUI 中按下 Enter 到 InputText 时如何引发事件

python - 为什么我的交换列表的两个元素的代码出错了?

c# - 如何在 C# 中向 List<T> 类添加更改事件?

c++ - 如何在 C++ 中自定义嵌套类的方法