SQLAlchemy IN yan tümcesi


237

Bu sorguyu sqlalchemy'de yapmaya çalışıyorum

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

Listeyi [123, 456]yürütme zamanında bağlamak istiyorum .

Yanıtlar:


332

Peki ya

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

düzenleme : ORM olmadan, olurdu

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

select()iki parametre alır, birincisi alınacak alanların bir listesi, ikincisi wheredurumdur. Bir tablo nesnesindeki tüm alanlara c(veya columns) özelliği üzerinden erişebilirsiniz .


6
Şu anda sqlachemy ORM bölümünü kullanmıyorum, ama sadece SQL İfade API.
wonzbak

136

Bildirici stili (yani ORM sınıfları) kullandığınızı varsayarsak, oldukça kolaydır:

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

db_sessionburada veritabanı oturumunuz User, ORM sınıfı ise __tablename__eşittir "users".


29
~( ~User.id.in_([123,456])) Veya not_from sqlalchemy.sql.expression( not_(User.id.in_([123,456]))) kullanın .
Xion


38

Alternatif bir yol, SQLAlchemy ile ham SQL modunu kullanmaktır, bağlayıcı olarak SQLAlchemy 0.9.8, python 2.7, MySQL 5.X ve MySQL-Python kullanıyorum, bu durumda bir demet gereklidir. Kodum aşağıda listelenmiştir:

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

Umarım her şey senin için çalışır.


5
Bu tür basit sorgular için ham SQL kullanıyorsanız, doğrudan psycopg2 veya diğer bağlayıcıları kullanmanız daha iyi olur.
omikron

6

Bu soruyu soran yorumlara dayanan İfade API'sı ile in_ilgili sütunun yöntemini kullanabilirsiniz .

Sorgulamak için

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

kullanım

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)

Bu varsayar user_tableve connuygun şekilde tanımlanmıştır.


1

Sadece python 3'te sqlalchemy ve pandalar kullanarak çözümümü paylaşmak istedim. Belki de, biri yararlı olurdu.

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

Yukarıdaki cevaplara sadece bir ek.

"IN" deyimi ile bir SQL yürütmek istiyorsanız, bunu yapabilirsiniz:

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)

İki puan:

  • IN deyimi için Parantez gerekmez ("... IN (% s)" gibi), "... IN% s"
  • Kimliklerinizin listesini bir demetin bir öğesi olmaya zorlayın. "," Öğesini unutmayın: (ids_list,)

DÜZENLEME Listenin uzunluğu bir veya sıfır ise bunun bir hataya yol açacağına dikkat edin!


2
Bence yapmalısın args = [(tuple(ids_list),)], lütfen tekrar kontrol et.
zs2020

4
OP, ham dbapi çağrısı kullanmadan sqlalchemy'de bunu nasıl yapacağını soruyor ...
cowbert

Bu ürettiği gibi tek bir öğe listesi ile çalışmaz (item, )ve SQL'de yanlış
danius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.