2009-10-14 44 views
3

我得到(可能是微不足道的)錯誤,但對可能的原因完全無能爲力。我想用SQLAlchemy在數據庫中插入兩個對象。這些對象是相關的,這裏是聲明。類用戶:插入兩個相關的對象在SQLAlchemy中失敗

class User(Base): 
    __tablename__ = 'cp_user' 

    id = Column(Integer, Sequence('id_seq'), primary_key=True) 
# ... more properties 

類圖片(用戶可能有很多人):

class Picture(Base): 
    __tablename__ = 'picture' 

    id = Column(Integer, Sequence('id_seq'), primary_key=True) 
    authorId = Column('author_id', Integer, ForeignKey('cp_user.id')) 
    author = relation(User, primaryjoin = authorId == User.id) 
# ... more properties 

我試圖插入新畫面,我取從數據庫中正確的用戶後,或剛剛創造了它:

s = newSession() 
user = s.query(User.name).filter("...some filter here...").first() 
if not(user): 
    user = User() 
    s.add(user) 
    s.commit() 

picture = Picture() 
picture.author = user 
s.add(picture) 
s.commit() 

這失敗例外:AttributeError: 'RowTuple' object has no attribute '_sa_instance_state'

我試着將作者的賦值移至構造函數 - 同樣的錯誤。我無法直接分配ID - 這打破了ORM的想法。

我該怎麼做?

回答

5

如果不採取not(user)分支,您的代碼將失敗。

您查詢User.name是一個列而不是綁定對象。

user = s.query(User).filter("...some filter here...").first() 

一旦對象被傳送到數據庫就會得到它的id。你正在分支中進行提交。這可能不是你想要的。你應該發出一個沖洗。閱讀有關差異的文檔。

此外,你不應該需要提交新創建的用戶。如果將用戶對象分配給關係,則應該透明地處理。 每個提交關閉一個交易,這可能是非常昂貴的(鎖定,磁盤查詢等)

+0

謝謝,用User.name替換用戶幫助!我以爲我瘋了,但現在它工作:) – 2009-10-14 22:14:55