Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SQLAlchemy WHERE IN một giá trị (SQL thô)

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chọn một hàng có giá trị lớn nhất cho một cột trong MySQL?

  2. Đôi khi NullPointerException trong ResultSetImpl.checkColumnBounds hoặc ResultSetImpl.getStringInternal

  3. Bảng lớn trong mysql Cập nhật các hàng dựa trên csv mọi lúc

  4. Chuyển đổi ngày mysql (datetime) thành định dạng ngày tốt hơn bằng php

  5. cách sắp xếp cột varchar chứa các giá trị số với lambdas linq thành Thực thể