0

是否可以在 Python 的 fdb 库中添加一个列表作为准备好的语句参数?

例子:

cur = con.cursor()
list = [1,2,3]
cur.execute("""SELECT * FROM data d WHERE d.field IN ?""", (list,))

结果:

"Error while preparing SQL statement:")\nDatabaseError: (\'Error while preparing SQL      statement:\\n- SQLCODE: -104\\n- Dynamic SQL Error\\n- SQL error code = -104\\n- Token unknown - line 4, column 33\\n- ?\', -104, 335544569)\n'

有没有已知的解决方案?提前致谢

4

4 回答 4

1

列表不能用作参数化查询的值,您需要自己构建它,通过为所有列表项动态创建具有足够占位符的查询,或使用列表中的文字值。

于 2013-09-14T07:56:48.090 回答
0

像这样试试。

cur.execute("""SELECT * FROM data d WHERE d.field IN %s """, (tuple(list), ))
于 2013-09-13T13:12:09.180 回答
0

理解这是一个老问题,未来的访问者应该知道,如果在列表中的字符串而不是整数上使用上面和评论中的答案,可能会带来一些 SQL 注入风险。我没有创建一个表来专门测试下面的代码,但在其他查询中使用了类似的代码。

仅供参考 - 其他 SQL 驱动程序,如 pyodbc 和 psycopg2 使用 ' %s ' 作为占位符,但只有一个 ' ? ' 使用 fdb 对我有用。

cur = con.cursor()
list = [1,2,3]

# Create a placeholder list containing a '?' for each element
placeholders = []
for i in list:
    placeholders.append('?')
# Change placeholder list to string of question marks separated by commas
ph_text = ', '.split(placeholders)

# Create sql statement
# Can use format here without risk of SQL injection because it is only ', ' and '?'
sql = """SELECT * FROM data d WHERE d.field IN ({0})""".format(ph_text)

# Execute the statement, passing list items in tuple for fdb to escape (avoid SQL-injection)
# Note that the list is converted to a tuple, 
# whereas the SQL in the question had the list as the first (and only) tuple element
cur.execute(sql, tuple(list))
于 2019-04-17T14:07:36.843 回答
-1

是的,但你的语法错误,Firebird 需要接收

SELECT * FROM data d WHERE d.field IN (1,2,3)所以我过去是通过(从记忆中)完成的

stmt="SELECT * FROM data d WHERE d.field IN (" + list + ")" cur.execute(stmt)

于 2013-09-13T13:08:30.443 回答