TaggedBlogRecord模型中缺少sqlalchemy中的继承以使其工作?

问题描述 投票:0回答:1

我正在尝试修改pyramid_blogr示例。唯一最接近的QA线程是this one和该线程中提到的link。我经历了他们两个。我正在使用具体的继承,据我所知,将为每个模型创建单独的表。但是,当我从第二个模型查询记录时,我得到的错误是该模型确实有像title这样的列或者在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))
python python-3.x sqlalchemy pyramid
1个回答
1
投票

更密切地阅读https://docs.sqlalchemy.org/en/latest/orm/inheritance.html#concrete-table-inheritance(重点补充):

应该注意两个关键点:

我们必须在每个子类上显式定义所有列,甚至是同名的列。像Employee.name这样的列不会复制到Manager或Engineer为我们映射的表中。

虽然Engineer和Manager类与Employee的继承关系映射,但它们仍然不包含多态加载。这意味着,如果我们查询Employee对象,则根本不会查询管理器和工程师表。

© www.soinside.com 2019 - 2024. All rights reserved.