programing

매개 변수로 사용되는 SQL 쿼리의 python 목록

closeapi 2023. 6. 10. 09:07
반응형

매개 변수로 사용되는 SQL 쿼리의 python 목록

나는 파이썬 리스트가 있어, sayl.

l = [1,5,8]

목록의 모든 요소에 대한 데이터를 가져오기 위해 SQL 쿼리를 작성하고 싶습니다.

select name from students where id = |IN THE LIST l|

어떻게 해야 하나요?

지금까지 답변은 값을 일반 SQL 문자열로 템플릿화하는 것이었습니다.정수에 대해서는 절대적으로 괜찮지만 문자열에 대해서는 문제가 발생합니다.

다음은 매개 변수화된 쿼리를 사용하는 변형으로, 두 가지 모두에 적합합니다.

placeholder= '?' # For SQLite. See DBAPI paramstyle.
placeholders= ', '.join(placeholder for unused in l)
query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders
cursor.execute(query, l)

가장 쉬운 방법은 목록을 다음으로 돌리는 것입니다.tuple 번째

t = tuple(l)
query = "select name from studens where id IN {}".format(t)

복잡하게 만들지 마십시오. 이에 대한 해결책은 간단합니다.

l = [1,5,8]

l = tuple(l)

params = {'l': l}

cursor.execute('SELECT * FROM table where id in %(l)s',params)

여기에 이미지 설명 입력

이것이 도움이 되었기를 바랍니다!!!

당신이 원하는 SQL은

select name from studens where id in (1, 5, 8)

만약 당신이 이것을 파이썬으로 구성하고 싶다면 당신은 사용할 수 있습니다.

l = [1, 5, 8]
sql_query = 'select name from studens where id in (' + ','.join(map(str, l)) + ')'

함수는 목록을 str.join 메서드를 사용하여 쉼표로 접착할 수 있는 문자열 목록으로 변환합니다.

또는 다음과 같습니다.

l = [1, 5, 8]
sql_query = 'select name from studens where id in (' + ','.join((str(n) for n in l)) + ')'

맵 함수보다 생성기 식을 선호하는 경우.

업데이트: S. Lott는 댓글에서 Python SQLite 바인딩이 시퀀스를 지원하지 않는다고 언급했습니다.그렇다면, 당신은 아마도

select name from studens where id = 1 or id = 5 or id = 8

생성자

sql_query = 'select name from studens where ' + ' or '.join(('id = ' + str(n) for n in l))

string.comma로 구분된 목록 값을 지정하고 형식 연산자를 사용하여 쿼리 문자열을 구성합니다.

myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist))

(고마워, 블레어 콘라드)

보빈스의 대답이 마음에 듭니다.

placeholder= '?' # For SQLite. See DBAPI paramstyle.
placeholders= ', '.join(placeholder for unused in l)
query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders
cursor.execute(query, l)

하지만 저는 이것을 알아차렸습니다.

placeholders= ', '.join(placeholder for unused in l)

다음으로 대체할 수 있습니다.

placeholders= ', '.join(placeholder*len(l))

저는 이것이 덜 영리하고 덜 일반적이라면 더 직접적이라고 생각합니다.여기서l길이가 필요합니다(즉, 정의하는 객체를 참조).__len__방법), 문제가 되지 않을 것입니다.그러나 자리 표시자는 단일 문자여야 합니다.다중 문자 자리 표시자를 지원하려면 다음을 사용합니다.

placeholders= ', '.join([placeholder]*len(l))

Postgre를 사용하는 경우Psycopg2 라이브러리가 있는 SQL은 튜플 적응으로 모든 이스케이프 및 문자열 보간을 수행할 수 있습니다. 예:

ids = [1,2,3]
cur.execute(
  "SELECT * FROM foo WHERE id IN %s",
  [tuple(ids)])

즉, 단지 당신이 합격하는지 확인하세요.IN로 사용할 수 .tuple그것이라면list어레이 구문을 사용할 수 있습니다.

cur.execute(
  "SELECT * FROM foo WHERE id = ANY (%s)",
  [list(ids)])

이 두 가지 모두 동일한 쿼리 계획으로 전환되므로 더 쉬운 것을 사용해야 합니다. 예를 들어 목록이 튜플로 오면 전자를 사용하고 목록에 저장되어 있으면 후자를 사용하십시오.

tuple 함수를 사용하는 경우 인라인을 사용합니다.

query = "Select * from hr_employee WHERE id in " % tuple(employee_ids) if len(employee_ids) != 1 else "("+ str(employee_ids[0]) + ")"

(1,)이 유효한 SQL이 아니기 때문에 단일 요소 튜플로 깨졌기 때문에 @umounted 답변에 대한 솔루션:

>>> random_ids = [1234,123,54,56,57,58,78,91]
>>> cursor.execute("create table test (id)")
>>> for item in random_ids:
    cursor.execute("insert into test values (%d)" % item)
>>> sublist = [56,57,58]
>>> cursor.execute("select id from test where id in %s" % str(tuple(sublist)).replace(',)',')'))
>>> a = cursor.fetchall()
>>> a
[(56,), (57,), (58,)]

sql 문자열에 대한 다른 솔루션:

cursor.execute("select id from test where id in (%s)" % ('"'+'", "'.join(l)+'"'))

질문에 따라 필드가 문자열 목록(int 대신)에 있는 위치에서 선택하려면 다음과 같이 실행하려면repr(tuple(map(str, l)))전체 예:

l = ['a','b','c']
sql = f'''

select name 
from students 
where id in {repr(tuple(map(str, l)))}
'''
print(sql)

반환: select name from students where id in ('a', 'b', 'c')

오라클의 날짜 목록의 경우, 이것은 효과가 있었습니다.

l = ['2020-11-24', '2020-12-28']
dates_str = ','.join([f'DATE {repr(s)}' for s in l])
dates_str = f'({dates_str})'

sql_cmd = f'''
select *
from students 
where 
and date in {dates_str}
'''

반환:select * from students where and date in (DATE '2020-11-24',DATE '2020-12-28')

만약 당신이 판다 df로부터 데이트 리스트를 얻어야 한다면, 그것은.df['date'].dt.strftime('%Y-%m-%d').unique()

그리고 나도 종종 그것이 필요했기 때문에, 목록에서 열을 추가하는 것.

# single list
f'select {','.join(l)}'

# multi list in different tables
sql_cmd = f'''
select {','.join(f't1.{s}' for s in l1)},
{','.join(f't1.{s}' for s in l2)},
{','.join(f't2.{s}' for s in l3)}  
'''
placeholders= ', '.join("'{"+str(i)+"}'" for i in range(len(l)))
query="select name from students where id (%s)"%placeholders
query=query.format(*l)
cursor.execute(query)

이것으로 당신의 문제가 해결될 것입니다.

더 간단한 솔루션:

lst = [1,2,3,a,b,c]

query = f"""SELECT * FROM table WHERE IN {str(lst)[1:-1}"""
l = [1] # or [1,2,3]

query = "SELECT * FROM table WHERE id IN :l"
params = {'l' : tuple(l)}
cursor.execute(query, params)

:var표기법이 더 간단해 보입니다. (파이썬 3.7)

예를 들어 sql 쿼리를 원하는 경우:

select name from studens where id in (1, 5, 8)

다음은 어떻습니까?

my_list = [1, 5, 8]
cur.execute("select name from studens where id in %s" % repr(my_list).replace('[','(').replace(']',')') )

이는 파라미터 대체를 사용하고 단일 값 목록 대소문자를 처리합니다.

l = [1,5,8]

get_operator = lambda x: '=' if len(x) == 1 else 'IN'
get_value = lambda x: int(x[0]) if len(x) == 1 else x

query = 'SELECT * FROM table where id ' + get_operator(l) + ' %s'

cursor.execute(query, (get_value(l),))

목록의 값 수가 1개 이상일 경우 이 작업이 작동합니다.

t = str(tuple(l))
if t[-2] == ',':
   t= t.replace(t[-2],"")
query = "select name from studens where id IN {}".format(t)

언급URL : https://stackoverflow.com/questions/283645/python-list-in-sql-query-as-parameter

반응형