【问题标题】:SQL pyodbc issueSQL pyodbc 问题
【发布时间】:2020-01-20 22:02:26
【问题描述】:

我尝试将以下查询作为准备好的语句执行:

self.cursor.execute("select distinct ? from isap.tn_documentation where ? = '?' and  ? <> ''", attribute2, attribute1, i.text(0), attribute2)

执行后出现以下错误:

SQL 包含 3 个参数标记,但提供了 4 个参数', 'HY000

【问题讨论】:

  • 您不必在谓词中单引号引用文本文字。这可能是问题所在。
  • 没有引号,我会得到错误的结果。
  • 我认为这不是真的。准备调用转到服务器并应该获取类型信息,使用这些信息应该允许客户端正确绑定参数。 (如果我没记错的话)

标签: python sql pyodbc


【解决方案1】:

您不能将列名作为查询参数传递。您需要连接查询字符串中的列名(同时将列值保留为参数)。

这应该看起来像:

self.cursor.execute(
    "select distinct " 
        + attribute2 
        + " from isap.tn_documentation where " 
        + attribute1 + " = ? and " + attribute2 + " <> ''", 
    i.text(0)
)

请注意,这样做会将您的代码暴露给 SQL 注入:如果您的属性输入来自您的代码之外,这是一个严重的安全漏洞。您需要确保它们不包含恶意数据(例如,根据允许值的固定列表检查每个属性的值:这应该很容易,因为我们正在处理列名)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多