SQLAlchemy自引用关系 - NoReferencedTableError错误

2 投票
2 回答
2753 浏览
提问于 2025-04-16 14:13

我正在使用SA 0.6.6版本,采用声明式风格,连接Postgres 8.3数据库,把Python对象映射到数据库中。我有一个自引用的表,想为它的子项创建一个关系属性。但是无论我怎么尝试,最终都会遇到一个叫做NoReferencedTableError的错误。

我的代码和SA网站上关于如何做这个的示例代码一模一样。

这是我的类。

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'相关的外键无法找到表'FilterFolder',因此无法生成指向列'id'的外键。

你们觉得我哪里做错了吗?

2 个回答

1

我用SQLAlchemy 0.6.6和sqlite检查了你的代码。我能够创建表格,添加父子组合,然后通过session.query再次获取它们。

根据我的观察,你提到的那个异常(NoReferencedTableError)是在SQLAlchemy的源代码中的schema.py文件里抛出的,跟具体的数据库没有关系。

有几个问题想问你:如果你用sqlite的链接而不是Postgres的链接,你还会看到同样的错误吗?你是怎么创建你的数据库结构的?我的结构大概是这样的:

engine = create_engine(db_url)
FilterFolder.metadata.create_all(self.dbengine)
2

这是我犯的一个愚蠢错误。我通常是通过指定实体类型来定义我的外键,而不是用字符串。我在使用不同的模式,所以当我把外键实体定义为字符串时,我还需要加上模式。

错误的写法:

parentFolderId = Column(Integer,ForeignKey('FilterFolder.id'))

正确的写法:

parentFolderId = Column(Integer,ForeignKey('SchemaName.FilterFolder.id'))

撰写回答