2012-10-05 23 views
10

Tengo una clase Item cuya id es una clave principal y se genera automáticamente. Ahora leo datos de otra fuente externa, creo un objeto Item y necesito verificar si este objeto ya está presente en mi tabla items. ¿Cómo lo hago?SQLAlchemy: compruebe si el objeto ya está presente en la tabla

+1

¿Es un escenario '' get_or_create''? Si es así: http://stackoverflow.com/questions/2546207/does-sqlalchemy-have-an-equivalent-of-djangos-get-or-create –

+0

@DemianBrecht, gracias por la respuesta, pero no, no es . – missingfaktor

+0

@missingfaktor ¿cómo sabes si ya existe? Basado en la clave principal? ¿O alguna otra llave única? – jadkik94

Respuesta

10

Puede buscar elementos que tengan los mismos atributos y comprobar si el recuento es mayor que cero.

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

El '> 0' es redundante ya que count() devuelve cero si no se encuentran coincidencias y un entero positivo de lo contrario. – kalu

+6

@kalu: "Explícito es mejor que implícito". - El Zen de Python –

+2

El uso del recuento hace que la base de datos haga más trabajo de lo que necesita. Vea mi respuesta a continuación para un método eficiente. – Salami

1

Usted podría intentar algo similar a esto:

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' 

Esto tiene el problema de que se actúa sobre la comisión, y luego se deshace ...

Otra opción, si se puede comprobar las propiedades individualmente, entonces esto podría funcionar:

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

La forma más eficiente es utilizar exists()

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