2009-10-14 2 views
3

나는 (아마도 사소한) 오류가 발생하지만 가능한 원인에 대해서는 전혀 알지 못합니다. SQLAlchemy를 사용하여 DB에 두 개의 객체를 삽입하려고합니다. 이러한 객체는 관련되어 있습니다. 여기에 선언이 있습니다. 클래스 사용자 :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 

나는 내가 DB에서 올바른 사용자를 가져온 한 후 새 그림을 삽입하려고, 또는 해요

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() 

이 예외와 함께 실패합니다 : I 시도 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() 

개체는 데이터베이스로 전송되는 즉시 설계되었습니다. 커밋을 사용하여 지점에서이 작업을 수행하고 있습니다. 이것은 아마도 당신이 원하는 것이 아닙니다. 플러시를 발행해야합니다. 차이점에 대한 문서를 읽으십시오.

또한 새로 만든 사용자를 커밋 할 필요가 없습니다. 관계에 사용자 객체를 할당하면이 객체는 투명하게 처리되어야합니다. 모든 커밋이 트랜잭션을 닫습니다. 잠금 (디스크 검색 등)이 매우 큽니다.

+0

감사합니다. User.name을 User helped로 바꾸십시오! 나는 내가 미쳤다고 생각했지만 지금은 효과가있다. :) –

관련 문제