2011-09-16 3 views
2

코드 :sqlite3.OperationalError : 근처에 "?": 파이썬 구문 오류 - 사용 'IN'연산자

print 'SELECT %s FROM %s WHERE %s %s %s' % (q_select, q_table, q_where, q_where_operator, q_value) 
rows = cursor.execute('SELECT %s FROM %s WHERE %s %s ?' % (q_select, q_table, q_where, q_where_operator), (q_value,)).fetchall() 

결과 :

SELECT ticket FROM my_table WHERE issue_key IN ('APSEC-2261') 
Traceback (most recent call last): 
    ... 
    File "code.py", line 1319, in validate 
    to_validate = db_query(q_select = 'ticket', q_table = 'my_table', q_where = 'issue_key', q_where_operator = 'IN', q_value = incident_query_list) 
    File "code.py", line 1834, in db_query 
    rows = cursor.execute('SELECT %s FROM %s WHERE %s %s ?' % (q_select, q_table, q_where, q_where_operator), (q_value,)).fetchall() 
sqlite3.OperationalError: near "?": syntax error 

내가 직접 정확한 쿼리를 수행 할 때 파이어 폭스의 SQLite는 관리자 SQLite는 파일, 나는 오류없이 적절한 응답을받지 :

SELECT ticket FROM my_table WHERE issue_key IN ('APSEC-2261') 
179908 

업데이트 :

대체를 시도하지 않고 여전히 동일한 오류가 발생합니다.

>>> test = cursor.execute('SELECT ticket FROM my_table WHERE issue_key IN ?', ('APSEC-2261',)).fetchall() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: near "?": syntax error 

업데이트 2 :

? DB-API의 매개 변수 대체, 여전히 같은 오류없이 시도.

>>> t = ('APSEC-2261',) 
>>> cursor.execute('SELECT ticket FROM my_table WHERE issue_key IN ?', t) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: near "?": syntax error 

업데이트 3 :

IN 연산자는 테이블 _ 이름으로 참조되고있다?

>>> cursor.execute('SELECT ticket FROM my_table WHERE issue_key IN \'APSEC-2261\'') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: no such table: APSEC-2261 

업데이트 4 :

는 이상한 TABLE_NAME 문제를 해결했습니다.

>>> cursor.execute('SELECT remediation_ticket FROM remediation WHERE issue_key IN (\'APSEC-2261\')') 
<sqlite3.Cursor object at 0x1723570> 
>>> cursor.execute('SELECT remediation_ticket FROM remediation WHERE issue_key IN (\'APSEC-2261\')').fetchall() 
[(u'179708',)] 

업데이트 5 :

인해 100 미만의 명성에 아직 내 자신의 솔루션을 쓸 수 없습니다. 문제는 IN 연산자를 사용할 때 괄호 안에 ?이 있어야한다는 것입니다.

>>> cursor.execute('SELECT remediation_ticket FROM remediation WHERE issue_key IN (?)', ('APSEC-2261',)) 
<sqlite3.Cursor object at 0x1723570> 
>>> cursor.execute('SELECT remediation_ticket FROM remediation WHERE issue_key IN (?)', ('APSEC-2261',)).fetchall() 
[(u'179708',)] 

따라서 내 db_query 방법이 문제는 다음

rows = cursor.execute('SELECT %s FROM %s WHERE %s %s (?)' % (q_select, q_table, q_where, q_where_operator), (q_value,)).fetchall() 

답변

3

하나가 IN 연산자를 사용하여 언제 수정해야들은 괄호 안에 ?, (?)을 가져야한다.

>>> t = ('APSEC-2261',) 
>>> cursor.execute('SELECT remediation_ticket FROM remediation WHERE issue_key IN (?)', t) 
<sqlite3.Cursor object at 0x1723570> 
>>> cursor.execute('SELECT remediation_ticket FROM remediation WHERE issue_key IN (?)', t).fetchall() 
[(u'179708',)] 
>>> # Show off how to check IN against multiple values. 
... 
>>> t = ('APSEC-2261','APSEC-2262') 
>>> cursor.execute('SELECT remediation_ticket FROM remediation WHERE issue_key IN (%s)' % (('?, ' * len(t))[:-2]), t) 
<sqlite3.Cursor object at 0x1723570> 
>>> cursor.execute('SELECT remediation_ticket FROM remediation WHERE issue_key IN (%s)' % (('?, ' * len(t))[:-2]), t).fetchall() 
[(u'179708',), (u'180208',), (u'180240',), (u'180245',), (u'180248',), (u'180334',), (u'180341',), (u'180365',), (u'180375',)] 
db_query 내 호출은 여러에 대한 q_value의 ?의 수 있도록 수정되었습니다

: 또한, 내 db_query 방법은 다음에 수정해야합니다

q_value_tuple =() 
for i in incidents: 
    q_value_tuple += (i,) 
tickets = db_query(q_select = 'remediation_ticket', q_table = 'remediation', q_where = 'issue_key', q_where_operator = 'IN', q_value = q_value_tuple) 

:

rows = cursor.execute('SELECT %s FROM %s WHERE %s %s (%s)' % (q_select, q_table, q_where, q_where_operator, ('?, ' * len(q_value))[:-2]), q_value).fetchall() 
3

을 따라서 , 몇 가지 문제가 있습니다. 우선, 발견 한 것처럼 괄호는 IN 절의 구문 일부입니다. 당신은 그들을 포함해야합니다.

둘째, q_value에 단일 값이 포함되어 있으면 명령이 올바르게 작동합니다. 그러나 IN()은 실제로 여러 개의 쉼표로 구분 된 값과 함께 사용됩니다 (단순한 경우 IN() 대신 =을 사용할 수도 있습니다). 단일 매개 변수 q_value에 쉼표로 구분 된 값 목록을 전달하려고하면 작동하지 않습니다. SQLite는 쉼표로 구분 된 전체 목록을 일치시킬 단일 값으로 처리합니다.

이 경우 쉼표로 구분 된 물음표 목록을 작성하여 문자열 형식으로 SQL에 삽입해야합니다. 그런 다음, 파이썬 값 목록을 작성하고 그 목록을 전달하여 물음표 당 하나의 값을 제공해야합니다.

+0

래리, 감사합니다! 여러 개의 'q_value'를 허용하도록 내 대답을 수정했습니다. – paragbaxi

+0

정확히 말하면, 목록이 아닌 값의 파이썬 튜플을 만들어야한다는 것을 알았습니다. – paragbaxi

+0

나는 당신의 용서를 구걸한다. 나는 명단을 기억하고 있었다. –

관련 문제