简体   繁体   English

sqlite3.OperationalError:靠近“?”:python中的语法错误—使用“ IN”运算符

[英]sqlite3.OperationalError: near “?”: syntax error in python — using 'IN' operator

Code: 码:

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()

Result: 结果:

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

When I perform the exact query directly on the SQLite file in Firefox's SQLite Manager, I receive a proper response without an error: 当我直接在Firefox的SQLite Manager中对SQLite文件执行精确查询时,我收到了正确的响应,没有错误:

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

Update: 更新:

Trying without the %s substitutions, and still receiving the same error. 尝试不使用%s替换,仍然收到相同的错误。

>>> 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

Update 2: 更新2:

Trying without ? 尝试没有? DB-API's parameter substitution, still the same error. 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

Update 3: 更新3:

Why is the IN operator being referenced as the table_name? 为什么将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

Update 4: 更新4:

Fixed the strange table_name issue. 修复了奇怪的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',)]

Update 5: 更新5:

Cannot write my own solution yet due to less than 100 reputation. 信誉低于100,因此无法编写我自己的解决方案。 The problem is when you use the IN operator, you must have the ? 问题是,当您使用IN运算符时,必须具有? in parentheses. 在括号内。

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

Therefore, my db_query method must be modified to the following 因此,必须将我的db_query方法修改为以下内容

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

The problem is when one uses the IN operator, they must have the ? 问题是当使用IN运算符时,它们必须具有? in parentheses, (?) . 在括号中, (?)

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

My call to db_query has been modified to allow for multiple ? 我对db_query的调用已修改为允许多个? s of q_value: 的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)

Also, my db_query method must be modified to the following: 另外,必须将我的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()

So, there are several issues. 因此,有几个问题。 First off, as you discovered, the parentheses are part of the syntax of the IN clause. 首先,正如您所发现的,括号是IN子句语法的一部分。 You must include them. 您必须包括它们。

Secondly, your command will work fine as long as q_value contains a single value. 其次,只要q_value包含单个值,您的命令就可以正常工作。 But IN () is really for use with multiple, comma-separated values (for the simply case, you might as well use = instead of IN () ). 但是IN ()实际上是与多个逗号分隔的值一起使用的(对于简单的情况,您最好使用=代替IN () )。 If you try to pass a comma-separated list of values in the single parameter q_value, it won't work. 如果您尝试在单个参数q_value中传递以逗号分隔的值列表,则它将不起作用。 SQLite will treat the entire comma-separated list as a single value to match against. SQLite会将整个逗号分隔的列表视为一个与之匹配的值。

In this case, you must build a list of comma-separated question marks and insert that into your SQL with string formatting. 在这种情况下,您必须构建一个逗号分隔的问号列表,并将其以字符串格式插入到SQL中。 Then, you must create a Python list of values, and pass that list to supply one value per question mark. 然后,您必须创建一个Python值列表,并传递该列表以为每个问号提供一个值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM