Jawaban:
Bagaimana tentang
session.query(MyUserClass).filter(MyUserClass.id.in_((123,456))).all()
sunting : Tanpa ORM, itu akan menjadi
session.execute(
select(
[MyUserTable.c.id, MyUserTable.c.name],
MyUserTable.c.id.in_((123, 456))
)
).fetchall()
select()
mengambil dua parameter, yang pertama adalah daftar bidang yang akan diambil, yang kedua adalah where
kondisi. Anda bisa mengakses semua bidang pada objek tabel melalui properti c
(atau columns
).
Dengan asumsi Anda menggunakan gaya deklaratif (yaitu kelas ORM), itu cukup mudah:
query = db_session.query(User.id, User.name).filter(User.id.in_([123,456]))
results = query.all()
db_session
adalah sesi basis data Anda di sini, sedangkan User
kelas ORM dengan __tablename__
sama dengan "users"
.
~
( ~User.id.in_([123,456])
) atau not_
dari sqlalchemy.sql.expression
( not_(User.id.in_([123,456]))
).
Cara alternatif adalah menggunakan mode SQL mentah dengan SQLAlchemy, saya menggunakan SQLAlchemy 0.9.8, python 2.7, MySQL 5.X, dan MySQL-Python sebagai konektor, dalam hal ini, diperlukan sebuah tuple. Kode saya tercantum di bawah ini:
id_list = [1, 2, 3, 4, 5] # in most case we have an integer list or set
s = text('SELECT id, content FROM myTable WHERE id IN :id_list')
conn = engine.connect() # get a mysql connection
rs = conn.execute(s, id_list=tuple(id_list)).fetchall()
Semoga semuanya berhasil untuk Anda.
Dengan API ekspresi, yang berdasarkan pada komentar adalah apa yang ditanyakan oleh pertanyaan ini, Anda dapat menggunakan in_
metode kolom yang relevan.
Ke kueri
SELECT id, name FROM user WHERE id in (123,456)
menggunakan
myList = [123, 456]
select = sqlalchemy.sql.select([user_table.c.id, user_table.c.name], user_table.c.id.in_(myList))
result = conn.execute(select)
for row in result:
process(row)
Ini mengasumsikan bahwa user_table
dan conn
telah didefinisikan secara tepat.
Hanya ingin berbagi solusi saya menggunakan sqlalchemy dan panda di python 3. Mungkin, orang akan merasa berguna.
import sqlalchemy as sa
import pandas as pd
engine = sa.create_engine("postgresql://postgres:my_password@my_host:my_port/my_db")
values = [val1,val2,val3]
query = sa.text("""
SELECT *
FROM my_table
WHERE col1 IN :values;
""")
query = query.bindparams(values=tuple(values))
df = pd.read_sql(query, engine)
Hanya tambahan jawaban di atas.
Jika Anda ingin menjalankan SQL dengan pernyataan "IN" Anda bisa melakukan ini:
ids_list = [1,2,3]
query = "SELECT id, name FROM user WHERE id IN %s"
args = [(ids_list,)] # Don't forget the "comma", to force the tuple
conn.execute(query, args)
Dua poin:
EDIT Perhatikan bahwa jika panjang daftar adalah satu atau nol, ini akan menimbulkan kesalahan!
args = [(tuple(ids_list),)]
, periksa kembali.
(item, )
dan itu tidak benar dalam SQL