2011-09-16 36 views
2

コード:sqlite3.OperationalError:近くに "?":Pythonで構文エラー - 使用して '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 

私が上で直接、正確なクエリを実行するとFirefoxの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オペレータは、table_nameの形式で参照されていますか?

>>> 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方法は、問題が一つIN演算子を使用するとき、彼らは括弧、(?)?を持っている必要があります以下の

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

答えて

3

に変更する必要があります。 db_queryへ

>>> 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',)] 

私の呼び出しはq_valueの複数?秒間許可するように変更されました。また

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) 

、私db_query方法は、次のように変更する必要があります。

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節の構文の一部です。あなたはそれらを含める必要があります。

第2に、q_valueに単一の値が含まれている限り、コマンドは正常に動作します。しかし、IN()は実際にはカンマで区切った複数の値を使用します(単純なケースではIN()の代わりに=を使用することもできます)。カンマで区切った値のリストを単一のパラメータq_valueに渡そうとすると、それは機能しません。 SQLiteはコンマで区切られたリスト全体を、一致する単一の値として扱います。

この場合、カンマ区切りの疑問符のリストを作成し、SQLに文字列書式を挿入する必要があります。次に、値のPythonリストを作成し、そのリストを渡して疑問符ごとに1つの値を指定する必要があります。

+0

ラリー、ありがとう!私は複数の 'q_value'sを許すように私の答えを修正しました。 – paragbaxi

+0

正確には、リストではなく値のPythonタプルを作成しなければならないことがわかりました。 – paragbaxi

+0

私はご容赦ください。私はリストを覚えていた。 –

関連する問題