我正在使用SA 0.6.6,声明式样式,针对Postgres 8.3,将Python对象映射到数据库。我有一个自我引用的表,我正在尝试为它的孩子建立一个关系属性。无论我尝试什么,我最终得到一个NoReferencedTableError。
我的代码看起来与sample code from the SA website for how to do this very thing完全相同。
这是课程。
class FilterFolder(Base):
__tablename__ = 'FilterFolder'
id = Column(Integer,primary_key=True)
name = Column(String)
isShared = Column(Boolean,default=False)
isGlobal = Column(Boolean,default=False)
parentFolderId = Column(Integer,ForeignKey('FilterFolder.id'))
childFolders = relationship("FilterFolder",
backref=backref('parentFolder', remote_side=id)
)
这是我得到的错误:
NoReferencedTableError:与列'FilterFolder.parentFolderId'关联的外键无法找到用于生成目标列'id'的外键的表'FilterFolder'
我在这里做错了什么想法?
答案 0 :(得分:2)
这对我来说是一个愚蠢的错误。我通常通过指定实体类型而不是字符串来指定我的FK。我使用不同的模式,所以当将FK实体定义为字符串时,我也需要模式。
断裂:
parentFolderId = Column(Integer,ForeignKey('FilterFolder.id'))
修正:
parentFolderId = Column(Integer,ForeignKey('SchemaName.FilterFolder.id'))
答案 1 :(得分:1)
我用SQLAlchemy 0.6.6和sqlite检查了你的代码。我能够创建表,添加父组合和子组合,并使用session.query
再次检索它们。
据我所知,您提到的异常(NoReferencedTableError
)仅在schema.py
(在SQLAlchemy源代码中)中抛出,并且不是特定于数据库的。
一些问题:如果使用sqlite URL而不是Postgres URL,你会看到同样的错误吗?你是如何创建架构的?我看起来像这样:
engine = create_engine(db_url)
FilterFolder.metadata.create_all(self.dbengine)