TaggedBlogRecord模型在sqlalchemy中继承时缺少什么才能正常工作?

时间:2019-03-11 20:11:17

标签: python python-3.x sqlalchemy pyramid

我正在尝试修改pyramid_blogr示例。唯一最接近的质量检查线程是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))

1 个答案:

答案 0 :(得分:1)

仔细阅读https://docs.sqlalchemy.org/en/latest/orm/inheritance.html#concrete-table-inheritance(添加重点):

  

应注意两个关键点:

     

我们必须在每个子类上显式定义所有列,即使是   相同的名称。此处不会复制诸如Employee.name之类的列   到经理或工程师为我们映射的表中。

     

当工程师   和Manager类之间的继承关系是   员工,他们仍然不包括多态加载。意思是,如果   我们查询Employee对象,经理和工程师表不是   完全可以查询。