【问题标题】:pyodbc - How to perform a select statement using a variable for a parameterpyodbc - 如何使用参数的变量执行选择语句
【发布时间】:2025-12-01 07:35:01
【问题描述】:

我正在尝试遍历名为吞吐量的表中的所有行,但针对特定的 DeviceName(我已将其存储在 data['DeviceName'] 中。我尝试了以下方法,但它不起作用:

for row in cursor.execute("select * from Throughput where DeviceName=%s"), %(data['DeviceName']):

编辑:也试过这个,但它不起作用:

for row in cursor.execute("select * from Throughput where(DeviceName), values(?)", (data['DeviceName']) ):

EDIT2:我的最终工作代码的 sn-p:

query = "select * from Throughput where DeviceName = '%s'" % data['Device Name']
      try:
          for row in cursor.execute(query):

【问题讨论】:

  • “不起作用”怎么办?您收到什么错误或意外行为?

标签: python sql variables select pyodbc


【解决方案1】:

您也可以parameterize声明:

...
cursor.execute("select * from Throughput where DeviceName = ?", data['DeviceName'])
...

这是一种更好的方法,原因如下:

  • 防止 SQL 注入(无论使用参数化 SQL 还是动态 SQL,您都应始终验证用户输入)
  • 您不必担心用单引号转义 where 子句值,因为参数是单独传递给数据库的
  • SQL 准备一次,查询的后续执行使用准备好的语句而不是重新编译

【讨论】:

  • 执行此操作时,有什么方法可以打印出整个查询,因为我遇到日期/时间转换错误,但是我不知道在哪里打印查询字符串,它显示问号而不是应该替换这些问号的实际值。如果您可以在*.com/questions/37861319/… 上查看我的问题,我将不胜感激。
  • @M.Barbieri,启用登录 MySQL 以查看实际执行的语句。
  • 总是验证用户输入”对于参数化查询来说似乎太强大了。如果我的参数需要一个整数,而调用代码的授权方法只允许使用整数,我看不出有什么好处。我希望所有不正确的方法都失败!
【解决方案2】:

我不知道我的问题是否与您的问题相似,但我的问题是因为我写了一个类似的查询 WHERE date > ?" "OR date NOT LIKE '9%' 而且我忘记在第一行的末尾或第二行的末尾放置一个简单的空格('')。最后我通过这样做解决了它。最终代码如下:

WHERE date > ? "
            "OR date NOT LIKE '9%'

注意:注意第一行末尾的最后一个''。

【讨论】:

    最近更新 更多