매개 변수로 SQL 쿼리의 목록 목록
주요 목록이 있습니다.
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.join 쉼표로 구분하여리스트의 값을 사용하여 포맷 연산자 쿼리를 형성한다.
myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist))
(감사합니다, 블레어 콘래드 )
나는 bobince의 대답을 좋아합니다.
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
에-length가 필요합니다 (즉, __len__
메서드 를 정의하는 object-를 참조 ). 이 문제가 없습니다. 그러나 자리 표시자는 단일 문자입니다. 다중 문자 자리를 표시하십시오.
placeholders= ', '.join([placeholder]*len(l))
(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)+'"'))
예를 들어 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),))
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}"""
참고 URL : https://stackoverflow.com/questions/283645/python-list-in-sql-query-as-parameter
'IT' 카테고리의 다른 글
수정 된 줄만 표시하는 Git diff (0) | 2020.08.16 |
---|---|
Java 프로젝트의 패키지 구조? (0) | 2020.08.16 |
List 간 자유롭게 변환 (0) | 2020.08.16 |
실행중인 BASH 펼쳐의 경로 확인 (0) | 2020.08.16 |
DLL이 디버그 또는 릴리스 빌드인지 확인 방법 (.NET) (0) | 2020.08.16 |