SQLAlchemy IN clause


237

ฉันพยายามที่จะทำแบบสอบถามนี้ใน sqlalchemy

SELECT id, name FROM user WHERE id IN (123, 456)

ฉันต้องการผูกรายการ[123, 456]ณ เวลาดำเนินการ

คำตอบ:


332

เกี่ยวกับ

session.query(MyUserClass).filter(MyUserClass.id.in_((123,456))).all()

แก้ไข : หากไม่มี ORM จะเป็นเช่นนั้น

session.execute(
    select(
        [MyUserTable.c.id, MyUserTable.c.name], 
        MyUserTable.c.id.in_((123, 456))
    )
).fetchall()

select()รับพารามิเตอร์สองตัวอันแรกคือรายการของเขตข้อมูลที่จะเรียกคืนอันที่สองคือwhereเงื่อนไข คุณสามารถเข้าถึงฟิลด์ทั้งหมดบนวัตถุตารางผ่านคุณสมบัติc(หรือcolumns)


6
ขณะนี้ฉันไม่ได้ใช้ ORM ในส่วนของ sqlachemy แต่เป็นเพียง SQL Expression API
wonzbak

136

สมมติว่าคุณใช้สไตล์การประกาศ (เช่นคลาส ORM) มันค่อนข้างง่าย:

query = db_session.query(User.id, User.name).filter(User.id.in_([123,456]))
results = query.all()

db_sessionเป็นเซสชั่นฐานข้อมูลของคุณที่นี่ในขณะที่Userเป็นชั้นออมกับการเท่าเทียมกัน__tablename__"users"


29
ใช้~( ~User.id.in_([123,456])) หรือnot_จากsqlalchemy.sql.expression( not_(User.id.in_([123,456])))
Xion

1
นี่คือเชื่อมโยงไปยังเอกสาร
Sergey Markelov

38

อีกวิธีหนึ่งคือใช้โหมด SQL ดิบกับ SQLAlchemy ฉันใช้ SQLAlchemy 0.9.8, python 2.7, MySQL 5.X และ MySQL-Python เป็นตัวเชื่อมต่อในกรณีนี้จำเป็นต้องใช้สิ่งอันดับ รหัสของฉันอยู่ด้านล่าง:

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()

หวังว่าทุกอย่างจะเหมาะกับคุณ


5
ถ้าคุณใช้ raw SQL สำหรับเคียวรีแบบง่ายคุณควรใช้ psycopg2 หรือตัวเชื่อมต่ออื่น ๆ โดยตรง
omikron

6

ด้วย expression API ซึ่งอิงตามความคิดเห็นคือสิ่งที่คำถามนี้ถามคุณสามารถใช้in_วิธีการของคอลัมน์ที่เกี่ยวข้อง

เพื่อสอบถาม

SELECT id, name FROM user WHERE id in (123,456)

ใช้

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)

สิ่งนี้ถือว่าuser_tableและconnได้รับการกำหนดอย่างเหมาะสม


1

แค่อยากจะแบ่งปันวิธีแก้ปัญหาของฉันโดยใช้ sqlalchemy และ pandas ใน python 3 บางทีเราอาจเห็นว่ามันมีประโยชน์

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)

-2

นอกเหนือจากคำตอบข้างต้น

หากคุณต้องการรัน SQL ด้วยคำสั่ง "IN" คุณสามารถทำได้:

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)

สองคะแนน:

  • ไม่จำเป็นต้องใช้วงเล็บสำหรับคำสั่ง IN (เช่น "... IN (% s)") เพียงแค่ใส่ "... IN% s"
  • บังคับให้รายการรหัสของคุณเป็นองค์ประกอบหนึ่งของ tuple อย่าลืมเครื่องหมาย ",": (ids_list,)

แก้ไข ระวังว่าหากความยาวของรายการเป็นหนึ่งหรือศูนย์จะทำให้เกิดข้อผิดพลาด!


2
ฉันคิดว่าคุณควรทำargs = [(tuple(ids_list),)]โปรดตรวจสอบอีกครั้ง
zs2020

4
OP กำลังถามวิธีการทำเช่นนี้ใน sqlalchemy ไม่ได้ใช้การเรียก dbapi แบบดิบ ๆ ...
cowbert

สิ่งนี้ใช้ไม่ได้กับรายการไอเท็มเดี่ยวที่สร้างขึ้น(item, )และไม่ถูกต้องใน SQL
danius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.