pyodbc 执行 SQL 代码
pyodbc execute SQL code
我正在尝试使用 pyodbc 游标以正确的方式执行以防止注入攻击,如下所示:
我的代码如下:
query = """\
SELECT
?,count(*)
FROM
?
WHERE
?=?
""", ('date', 'myTable', 'date', '2017-05-08')
cursor.execute(query)
我得到一个错误:
TypeError: The first argument to execute must be a string or unicode query.
对于正确答案,我想:
- 保持问号格式以避免SQL注入攻击
- 保持三引号格式,这样我就可以编写长的 SQL 查询,而不会影响代码的可读性。
有办法实现吗?我知道我可以使用 """ %s """ %('table')
格式类型,但这违背了这个问题的目的。
您有 2 个问题:
query
是一个元组。执行参数化查询的方式如下
如下:
query = """SELECT ?,count(*)
FROM ?
WHERE ?=? """
args = ('date', 'myTable', 'date', '2017-05-08')
cursor.execute(query, args)
你可以通过 query
和 *
。这会将 query
扩展为一个字符串和一个元组,这正是 execute
所期望的:
cursor.execute(*query) # 'query' here is defined as it is in your example
但是,那是行不通的。您不能使用参数化查询在 select 和 from 子句中使用参数。您也可以不在 where 子句中使用参数作为列名。
你(通常)不必担心 SQL 如果值不是由用户输入的(或者如果用户无论如何都不能更改)注入。
我正在尝试使用 pyodbc 游标以正确的方式执行以防止注入攻击,如下所示:
我的代码如下:
query = """\
SELECT
?,count(*)
FROM
?
WHERE
?=?
""", ('date', 'myTable', 'date', '2017-05-08')
cursor.execute(query)
我得到一个错误:
TypeError: The first argument to execute must be a string or unicode query.
对于正确答案,我想:
- 保持问号格式以避免SQL注入攻击
- 保持三引号格式,这样我就可以编写长的 SQL 查询,而不会影响代码的可读性。
有办法实现吗?我知道我可以使用 """ %s """ %('table')
格式类型,但这违背了这个问题的目的。
您有 2 个问题:
query
是一个元组。执行参数化查询的方式如下 如下:query = """SELECT ?,count(*) FROM ? WHERE ?=? """ args = ('date', 'myTable', 'date', '2017-05-08') cursor.execute(query, args)
你可以通过
query
和*
。这会将query
扩展为一个字符串和一个元组,这正是execute
所期望的:cursor.execute(*query) # 'query' here is defined as it is in your example
但是,那是行不通的。您不能使用参数化查询在 select 和 from 子句中使用参数。您也可以不在 where 子句中使用参数作为列名。
你(通常)不必担心 SQL 如果值不是由用户输入的(或者如果用户无论如何都不能更改)注入。