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.