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.

对于正确答案,我想:

  1. 保持问号格式以避免SQL注入攻击
  2. 保持三引号格式,这样我就可以编写长的 SQL 查询,而不会影响代码的可读性。

有办法实现吗?我知道我可以使用 """ %s """ %('table') 格式类型,但这违背了这个问题的目的。

您有 2 个问题:

  1. 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
    
  2. 但是,那是行不通的。您不能使用参数化查询在 select 和 from 子句中使用参数。您也可以不在 where 子句中使用参数作为列名。

你(通常)不必担心 SQL 如果值不是由用户输入的(或者如果用户无论如何都不能更改)注入。