我正在尝试修改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))
更密切地阅读https://docs.sqlalchemy.org/en/latest/orm/inheritance.html#concrete-table-inheritance(重点补充):
应该注意两个关键点:
我们必须在每个子类上显式定义所有列,甚至是同名的列。像Employee.name这样的列不会复制到Manager或Engineer为我们映射的表中。
虽然Engineer和Manager类与Employee的继承关系映射,但它们仍然不包含多态加载。这意味着,如果我们查询Employee对象,则根本不会查询管理器和工程师表。