2012-10-05 20 views
10

Item sınıfında bir birincil anahtar ve otomatik olarak oluşturulmuş bir sınıf var. Şimdi başka bir dış kaynaktan veri okuyorum, bir Item nesnesi oluşturdum ve bu nesnenin zaten items tablosumda olup olmadığını kontrol etmem gerekiyor. Nasıl yaparım?SQLAlchemy:

+1

bir '' get_or_create'' senaryo var mı? Eğer öyleyse: http://stackoverflow.com/questions/2546207/does-sqlalchemy-have-an-equivalent-of-djangos-get-or-create –

+0

@DemianBrecht, yanıt için teşekkürler, ama hayır, değil . – missingfaktor

+0

@missingfaktor zaten var olup olmadığını nasıl anlarsınız? Birincil anahtara göre mi? Ya da başka bir benzersiz anahtar? – jadkik94

cevap

10

Aynı özelliklere sahip olan öğeleri sorgulayabilir ve sayının sıfırdan büyük olup olmadığını kontrol edebilirsiniz.

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

Herhangi bir eşleşme bulunmazsa count() sıfırlanır ve aksi halde pozitif bir tam sayı olduğu için '> 0 'gereksizdir. – kalu

+6

@kalu: "Açık, örtük olmaktan iyidir." - Python'un Zen'i –

+2

Sayımı kullanmak veritabanının daha fazla iş yapmasını gerektiriyor. Verimli bir yöntem için cevabımı aşağıya bakın. – Salami

1

Buna benzer bir şey deneyebilirsiniz: Bu işlemekle üzerinde etki yapar, sonra geri alır sorunu var

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' 

...

başka seçeneği kontrol edebilirsiniz eğer Ayrı ayrı özellikler, daha sonra bu işe yarayabilir:

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

En verimli yöntem kullanmaktır. exists()

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