2012-10-05 15 views
10

Ho una classe Item di cui id è una chiave primaria e generata automaticamente. Ora leggo i dati da qualche altra fonte esterna, creo un oggetto Item e devo controllare se questo oggetto è già presente nella mia tabella items. Come lo faccio?SQLAlchemy: verificare se l'oggetto è già presente nella tabella

+1

È uno scenario '' get_or_create''? In tal caso: http://stackoverflow.com/questions/2546207/does-sqlalchemy-have-an-equivalent-of-djangos-get-or-create –

+0

@DemianBrecht, grazie per la risposta, ma no, non lo è . – missingfaktor

+0

@missingfaktor come fai a sapere se esiste già? Basato sulla chiave primaria? O qualche altra chiave unica? – jadkik94

risposta

10

È possibile eseguire una query per gli articoli con gli stessi attributi e verificare se il conteggio è maggiore di zero.

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

Il '> 0' è ridondante poiché count() restituisce zero se non vengono trovate corrispondenze e un numero intero positivo altrimenti. – kalu

+6

@kalu: "L'esplicito è meglio che implicito." - The Zen of Python –

+2

L'utilizzo di count rende il database più utile di quanto necessario. Vedi la mia risposta qui sotto per un metodo efficiente. – Salami

1

Si potrebbe provare qualcosa di simile a questo:

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' 

Questo ha il problema che agisce su di commettere, e poi rotola indietro ...

Un'altra opzione, se è possibile controllare le proprietà individualmente, allora questo potrebbe funzionare:

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

Il modo più efficace è quello di utilizzare exists()

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