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.