2011-03-22 77 views
1

我使用針對Postgres 8.3的SA 0.6.6,聲明式樣式,將Python對象映射到數據庫。我有一個自引用的表,我正在嘗試爲它的子項創建一個關係屬性。無論我嘗試什麼,我都會遇到NoReferencedTableError。SQLAlchemy自引用關係 - 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」找不到表「FilterFolder」與assocated外鍵生成的外鍵目標列「ID」

任何想法我在這裏做錯了嗎?

回答

2

這是我的一個愚蠢的錯誤。我通常通過指定實體類型來指定我的FK,而不是字符串。我使用不同的模式,所以當將FK實體定義爲字符串時,我也需要模式。

破碎:

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

修正:

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

爲了回覆並回答你自己的問題,我們的村莊將爲你的榮譽犧牲一隻山羊科裏庫根。不幸的是,它不會幫助我解決我的問題,但你已經高興我們的上帝。 – 2013-12-29 21:18:34

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) 
+0

我們沒有創造我們的SA模式,但與腳本正在這樣做。我會試一試sqlite,看看會發生什麼。 – 2011-03-23 12:26:00