SQLAlchemy IN 절


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
현재 sqlachemy의 ORM 부분을 사용하지 않고 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와 ORM 클래스입니다 __tablename__동일 "users".


29
사용 ~( ~User.id.in_([123,456])) 또는 not_에서 sqlalchemy.sql.expression( not_(User.id.in_([123,456]))).
— Xion

1
다음은 문서에 대한 링크 입니다.
— Sergey Markelov

38

다른 방법은 SQLAlchemy와 함께 원시 SQL 모드를 사용하는 것입니다. 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
이러한 간단한 쿼리에 원시 SQL을 사용하는 경우 psycopg2 또는 다른 커넥터를 직접 사용하는 것이 좋습니다.
— omikron

6

주석을 기반으로하는이 질문에서 요구하는 식 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

파이썬 3에서 sqlalchemy와 pandas를 사용하여 솔루션을 공유하고 싶었습니다. 아마도 유용 할 것입니다.

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

위의 답변에 추가하십시오.

"IN"문으로 SQL을 실행하려면 다음을 수행하십시오.

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"
  • ID 목록을 튜플의 한 요소로 만듭니다. ","를 잊지 마십시오 : (ids_list,)

편집 목록의 길이가 1 또는 0 인 경우 오류가 발생합니다.


2
나는 당신이해야한다고 생각합니다 args = [(tuple(ids_list),)], 다시 확인하십시오.
— zs2020

4
OP는 원시 dbapi 호출을 사용하지 않고 sqlalchemy에서이 작업을 수행하는 방법을 묻습니다.
— cowbert

이것은 단일 항목 목록에서 작동하지 않으며 (item, )SQL에서는 올바르지 않습니다.
— danius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.