2012-10-05 10 views
10

Mam klasę Item, której id jest kluczem podstawowym i generowane automatycznie. Teraz czytam dane z innego zewnętrznego źródła, tworzę obiekt Item i muszę sprawdzić, czy ten obiekt jest już obecny w mojej tabeli items. Jak mam to zrobić?SQLAlchemy: Sprawdź, czy obiekt jest już obecny w tabeli

+1

Czy to scenariusz '' get_or_create''? Jeśli tak, to: http://stackoverflow.com/questions/2546207/does-sqlalchemy-have-an-equivalent-of-djangos-get-or-create –

+0

@DemianBrecht, dzięki za odpowiedź, ale nie, to nie jest . – missingfaktor

+0

@missingfaktor skąd wiadomo, że już istnieje? Na podstawie klucza podstawowego? Lub jakiś inny unikalny klucz? – jadkik94

Odpowiedz

10

Można wyszukiwać produkty o tych samych atrybutach i sprawdzać, czy liczba jest większa od zera.

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

'> 0' jest nadmiarowe, ponieważ count() zwraca zero, jeśli nie znaleziono żadnych dopasowań, a dodatnia liczba całkowita w przeciwnym przypadku. – kalu

+6

@kalu: "Jawny jest lepszy niż niejawny." - The Zen of Python –

+2

Używanie count sprawia, że ​​baza danych wykonuje więcej pracy niż potrzebuje. Zobacz moją odpowiedź poniżej dla skutecznej metody. – Salami

1

można spróbować coś podobnego do tego:

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' 

to ma problem, że działa ona na popełnienie, a następnie wycofuje ...

inną opcją, jeśli można sprawdzić właściwości pojedynczo, to może działać:

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

Najbardziej efektywnym sposobem jest użycie exists()

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