SQLAlchemy自引用关系 - NoReferencedTableError错误
我正在使用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'))