Không, các tham số SQL chỉ bao giờ đối phó với vô hướng các giá trị. Bạn sẽ phải tạo SQL ở đây; nếu bạn cần SQL thô, hãy sử dụng:
statement = "SELECT * FROM table WHERE `key`='rating' AND uid IN ({})".format(
', '.join([':i{}'.format(i) for i in range(len(some_list))]))
my_sess.execute(
statement,
params={'i{}'.format(i): v for i, v in enumerate(some_list)})
).fetchall()
ví dụ. tạo đủ tham số để giữ tất cả các giá trị trong some_list
với định dạng chuỗi, sau đó tạo các tham số phù hợp để điền chúng.
Vẫn tốt hơn là sử dụng literal_column()
đối tượng
để thực hiện tất cả việc tạo ra cho bạn:
from sqlalchemy.sql import literal_column
uid_in = literal_column('uid').in_(some_list)
statement = "SELECT * FROM able WHERE `key`='rating' AND {}".format(uid_in)
my_sess.execute(
statement,
params={'uid_{}'.format(i): v for i, v in enumerate(some_list)})
).fetchall()
nhưng sau đó bạn có thể chỉ cần tạo toàn bộ câu lệnh bằng cách sử dụng mô-đun `sqlalchemy.sql.expression, vì điều này sẽ giúp hỗ trợ nhiều phương ngữ cơ sở dữ liệu dễ dàng hơn nhiều.
Hơn nữa, uid_in
đối tượng đã giữ các tham chiếu đến các giá trị phù hợp cho các tham số liên kết; thay vì biến nó thành một chuỗi như chúng ta làm với str.format()
hành động ở trên, SQLAlchemy sẽ có đối tượng thực tế cộng với các tham số liên quan và bạn sẽ không còn phải tạo params
từ điển một trong hai .
Những điều sau sẽ hoạt động:
from sqlalchemy.sql import table, literal_column, select
tbl = table('table')
key_clause = literal_column('key') == 'rating'
uid_clause = literal_column('uid').in_(some_list)
my_sess.execute(select('*', key_clause & uid_clause, [tbl]))
trong đó sqlalchemy.sql.select()
lấy một thông số cột (ở đây được mã hóa cứng thành *
), mệnh đề where (được tạo từ hai mệnh đề có &
để tạo một AND
trong SQL mệnh đề) và một danh sách các lựa chọn; đây của bạn sqlalchemy.sql.table()
giá trị.
Bản demo nhanh:
>>> from sqlalchemy.sql import table, literal_column, select
>>> some_list = ['foo', 'bar']
>>> tbl = table('table')
>>> key_clause = literal_column('key') == 'rating'
>>> uid_clause = literal_column('uid').in_(some_list)
>>> print select('*', key_clause & uid_clause, [tbl])
SELECT *
FROM "table"
WHERE key = :key_1 AND uid IN (:uid_1, :uid_2)
nhưng cây đối tượng thực tế được tạo ra từ tất cả điều này cũng chứa các giá trị thực tế cho các tham số liên kết, vì vậy my_sess.execute()
có thể truy cập trực tiếp những thứ này.