SQLAlchemy自引用关系 - NoReferencedTableError

时间:2011-03-22 20:23:44

标签: python sqlalchemy self-reference

我正在使用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'

我在这里做错了什么想法?

2 个答案:

答案 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)