2

我使用 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”相关联的外键找不到用于生成目标列“id”的外键的表“FilterFolder”

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

4

2 回答 2

2

这对我来说是一个愚蠢的错误。我通常通过指定实体类型而不是字符串来指定我的 FK。我正在使用不同的架构,因此在将 FK 实体定义为字符串时,我还需要架构。

破碎的:

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

固定的:

parentFolderId = Column(Integer,ForeignKey('SchemaName.FilterFolder.id'))
于 2011-03-23T14:21:18.037 回答
1

我用 SQLAlchemy 0.6.6 和 sqlite 检查了你的代码。我能够创建表,添加父子组合,然后使用session.query.

据我所知,您提到的异常 ( NoReferencedTableError) 是专门抛出的schema.py(在 SQLAlchemy 源中),并且不是特定于数据库的。

一些问题:如果您使用 sqlite URL 而不是 Postgres,您会看到同样的错误吗?你是如何创建你的架构的?我的看起来像这样:

engine = create_engine(db_url)
FilterFolder.metadata.create_all(self.dbengine)
于 2011-03-22T21:26:35.010 回答