【问题标题】:What is missing in the TaggedBlogRecord model for inheritance in sqlalchemy for it to work?sqlalchemy 中用于继承的 TaggedBlogRecord 模型中缺少什么才能正常工作?
【发布时间】:2019-08-02 05:26:48
【问题描述】:

我正在尝试修改pyramid_blogr 示例。唯一最近的 QA 线程是 this one 和该线程中提到的 link。我经历了他们两个。我正在使用具体继承,据我了解将为每个模型创建单独的表。不过,当我从第二个模型查询记录时,我收到错误消息,指出该模型确实具有标题之类的列或在 TaggedBlogRecord 中创建的列。

错误

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: ====> entries.created  <======
[SQL: SELECT entrieslanguage.id AS entrieslanguage_id 
FROM entrieslanguage ORDER BY entries.created DESC
 LIMIT ? OFFSET ?]

示例代码如下

class BlogRecord(Base):
    __tablename__ = 'entries'
    id = Column(Integer, primary_key=True)
    title = Column(Unicode(255), unique=True, nullable=False)
    body = Column(UnicodeText, default=u'')
    created = Column(DateTime, default=datetime.datetime.utcnow)
    edited = Column(DateTime, default=datetime.datetime.utcnow)


class TaggedBlogRecord(BlogRecord):
    __tablename__ = 'taggedentries'
    __mapper_args__ = {'concrete':True}
    id = Column(Integer, primary_key=True)
    tags = Column(Unicode(255))

【问题讨论】:

  • 是否也更新了更新数据库的脚本,然后运行脚本?
  • 是的,我做到了。我忽略了@Michael Merickel 的回答。派生模型不会隐式继承表字段。

标签: python python-3.x sqlalchemy pyramid


【解决方案1】:

更仔细地阅读https://docs.sqlalchemy.org/en/latest/orm/inheritance.html#concrete-table-inheritance(强调):

需要注意两个关键点:

我们必须在每个子类上明确定义所有列,即使是那些 同名。这里的Employee.name之类的列没有复制出来 到经理或工程师为我们映射的表格。

当工程师 和 Manager 类以继承关系映射 员工,他们仍然不包括多态加载。意思是,如果 我们查询员工对象,经理和工程师表不是 完全被问到了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多