2012-10-05 47 views
10

Tôi có một lớp Itemid là khóa chính và được tạo tự động hay không. Bây giờ tôi đọc dữ liệu từ một số nguồn bên ngoài khác, tạo đối tượng Item và cần kiểm tra xem đối tượng này đã có trong bảng items của tôi hay chưa. Tôi phải làm nó như thế nào?SQLAlchemy: Kiểm tra xem đối tượng đã có trong bảng

+1

Đây có phải là kịch bản '' get_or_create'' không? Nếu vậy: http://stackoverflow.com/questions/2546207/does-sqlalchemy-have-an-equivalent-of-djangos-get-or-create –

+0

@DemianBrecht, cảm ơn phản hồi, nhưng không, nó không phải là . – missingfaktor

+0

@missingfaktor làm thế nào để bạn biết nếu nó đã tồn tại? Dựa trên khóa chính? Hoặc một số khóa duy nhất khác? – jadkik94

Trả lời

10

Bạn có thể truy vấn các mục có cùng thuộc tính và kiểm tra xem số có lớn hơn 0 hay không.

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

'> 0' là thừa vì count() trả về 0 nếu không tìm thấy kết quả phù hợp và một số nguyên dương khác. – kalu

+6

@kalu: "Rõ ràng là tốt hơn là ngầm." - Zen của Python –

+2

Sử dụng tính năng làm cho cơ sở dữ liệu làm việc nhiều hơn sau đó nó cần. Xem câu trả lời của tôi dưới đây cho một phương pháp hiệu quả. – Salami

1

Bạn có thể thử một cái gì đó tương tự như sau:

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' 

này có vấn đề mà nó hoạt động theo cam kết, và sau đó cuộn lại ...

Một lựa chọn khác, nếu bạn có thể kiểm tra các thuộc tính riêng lẻ, sau đó điều này có thể hoạt động:

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

Cách hiệu quả nhất là sử dụng exists()

q = session.query(Item.id).filter(Item.email==email) 
session.query(q.exists()).scalar() # returns True or False 
Các vấn đề liên quan