2015-02-02 27 views
6

chuyên gia Hi SQLAlchemy trên mạng, đây là một khó khăn cho bạn:SQLAlchemy truy vấn lọc "cột giống như bất kỳ (mảng)"

Tôi đang cố gắng để viết một truy vấn mà giải quyết vào một cái gì đó như:

SELECT * FROM MyTable where my_column LIKE ANY (array['a%', 'b%']) 

sử dụng SQLAlchemy:

foo = ['a%', 'b%'] 

# this works, but is dirty and silly 
DBSession().query(MyTable).filter("my_column LIKE ANY (array[" + ", ".join(["'" + f + "'" for f in token.tree_filters]) + "])") 

# something like this should work (according to documentation), but doesn't (throws "AttributeError: Neither 'AnnotatedColumn' object nor 'Comparator' object has an attribute 'any'" 
DBSession().query(MyTable).filter(MyTable.my_column.any(foo, operator=operators.like) 

Bất kỳ giải pháp nào?

+0

có thể trùng lặp của [Elixir/SQLAlchemy tương đương với SQL "LIKE" tuyên bố?] (Http://stackoverflow.com/questions/3325467/elixir-sqlalchemy-equivalent-to-sql-like-statement) – dshgna

Trả lời

13

Sử dụng or_()like(), đoạn code sau nên đáp ứng nhu cầu của bạn tốt:

from sqlalchemy import or_ 

foo = ['a%', 'b%'] 
DBSession().query(MyTable).filter(or_(*[MyTable.my_column.like(name) for name in foo])) 

Một nơi mà điều kiện WHERE my_column LIKE 'a%' OR my_column LIKE 'b%' sẽ được tạo ra từ trên mã.

Đối với lý do tại sao any() của bạn không làm việc, tôi nghĩ rằng đó là bởi vì nó đòi hỏi my_column trở thành một danh sách (xem here), và, ví dụ, query(MyTable).filter(MyTable.my_list_column.any(name='abc')) là để trở MyTable hàng nếu bất kỳ phần tử trong my_list_column cột (một danh sách) của hàng đó được đặt tên với 'abc', vì vậy nó thực sự khá khác với nhu cầu của bạn.

+0

Cảm ơn bạn đã trả lời. Sử dụng or_() là một giải pháp mà tôi nghĩ đến, nhưng không muốn điều đó bởi vì nó có thể làm cho truy vấn khá dài. Nhưng vẫn tốt hơn giải pháp bẩn thỉu của tôi, tôi đoán vậy. – user1599438

+0

@ user1599438 Tôi sợ bạn cần phải sử dụng 'hoặc _()' cho trường hợp này, và nó thực sự không phải là dài: p –

1

Bạn có thể cố gắng sử dụng any_()

Trong trường hợp của bạn nó sẽ giống như thế này:

from sqlalchemy import any_ 

foo = ['a%', 'b%'] 
DBSession().query(MyTable).filter(MyTable.my_column.like(any_(foo))) 
Các vấn đề liên quan