2012-10-05 2 views
10

Itemid이 기본 키이고 자동 생성되는 클래스가 있습니다. 이제 다른 외부 소스에서 데이터를 읽고 Item 개체를 만들고이 개체가 이미 내 items 테이블에 있는지 확인해야합니다. 어떻게해야합니까?SQLAlchemy : 개체가 이미 테이블에 있는지 확인하십시오.

+1

"get_or_create"시나리오입니까? 그렇다면 http://stackoverflow.com/questions/2546207/does-sqlalchemy-have-an-equivalent-of-djangos-get-or-create –

+0

@DemianBrecht, 응답 해 주셔서 감사합니다. 아니요, 그렇지 않습니다. . – missingfaktor

+0

@missingfaktor 이미 존재하는지 어떻게 알 수 있습니까? 기본 키를 기반으로합니까? 아니면 다른 고유 키? – jadkik94

답변

10

동일한 속성을 가진 항목을 쿼리하고 개수가 0보다 큰지 확인할 수 있습니다.

if session.query(Item.id).filter(Item.email==newItem.email, 
           Item.type==newItem.type).count() > 0: 
    // item exists 
+1

count()는 일치하는 것이 없으면 0을 반환하고 그렇지 않으면 양의 정수를 반환하기 때문에'> 0'은 중복됩니다. – kalu

+6

@kalu : "암시 적보다 낫습니다." - Zen of Python –

+2

count를 사용하면 데이터베이스가 더 잘 작동하게됩니다. 효율적인 방법은 내 대답을 참조하십시오. – Salami

1

이 비슷한 뭔가를 시도 할 수 있습니다 : 이것은 투입에 작용하고 롤백 문제가있는

from sqlalchemy import exc 

try: 
    session.add(item) 
    session.commit() 
except exc.IntegrityError: 
    session.rollback() 
    print 'This item fails one of the unique/foreign key checks!' 
except: 
    print 'There was another error' 
    raise 
else: 
    print 'Everything is OK' 

...

또 다른 옵션을 확인할 수있는 경우 속성을 개별적으로 설정하면 작동 할 수 있습니다.

session.query(Item).filter_by(x=item.x, y=item.y).count() == 0 
8

가장 효율적인 방법은 exists()

q = session.query(Item.id).filter(Item.email==email) 
session.query(q.exists()).scalar() # returns True or False 
관련 문제