2011-10-04 39 views
32

Làm thế nào để kiểm tra dữ liệu trong truy vấn có tồn tại?sqlalchemy tồn tại cho truy vấn

Ví dụ:

users_query = User.query.filter_by(email='[email protected]') 

Làm thế nào tôi có thể kiểm tra xem người dùng với email mà tồn tại?

Bây giờ tôi kiểm tra điều này với

users_query.count() 

nhưng muốn kiểm tra xem nó có tồn tại .

Cảm ơn!

Trả lời

12

Không có cách nào mà tôi biết để làm điều này bằng cách sử dụng api truy vấn orm. Nhưng bạn có thể giảm xuống mức thấp hơn và sử dụng exists từ sqlalchemy.sql.expression:

from sqlalchemy.sql.expression import select, exists 

users_exists_select = select((exists(users_query.statement),)) 
print engine.execute(users_exists_select).scalar() 
56

Các giải pháp sau đây là một chút đơn giản hơn:

from sqlalchemy.sql import exists 

print session.query(exists().where(User.email == '...')).scalar() 
+0

Lưu ý rằng điều này sẽ cho kết quả sai đối với các loại đa hình. Khi lọc trên cả thuộc tính cha và con, truy vấn kết quả sẽ chọn từ sản phẩm Descartes (nối ngoài) của bảng. Để khắc phục nó, bạn nên đặt mệnh đề 'FROM' theo cách thủ công thông qua' select_from': 'e = tồn tại (select ([1]). Select_from (User) .where (and_ (User.email == '...' , ...))). select() ' – aikoven

+0

@aikoven: kết quả gợi ý của bạn trong một' Mỗi bảng dẫn xuất phải có lỗi riêng biệt '. Thêm 'exist (…) .select(). Alias ​​('foo')' đã sửa nó (xem [alias()] (http://docs.sqlalchemy.org/en/latest/core/selectable.html#sqlalchemy. sql.expression.alias)). – Jens

12

Các tùy chọn có thể chấp nhận và dễ đọc nhất đối với tôi là

session.query(<Exists instance>).scalar() 

như

session.query(User.query.filter(User.id == 1).exists()).scalar() 

trả về True hoặc False.

+1

Ngoài ra, lưu ý rằng một số cơ sở dữ liệu như SQL Server không cho phép một biểu thức EXISTS có mặt trong mệnh đề cột của một SELECT. Để chọn một giá trị boolean đơn giản dựa trên sự tồn tại như là một WHERE, hãy sử dụng sqlalchemy.literal: 'session.query (literal (True)). Filter (q.exists()). Scalar()' – kaka

Các vấn đề liên quan