【问题标题】:Passing a parameter to a sql query using pyodbc failing使用pyodbc将参数传递给sql查询失败
【发布时间】:2018-04-18 20:51:41
【问题描述】:

我已经阅读了数十篇类似的帖子并尝试了所有方法,但在尝试使用 pyodbc 将参数传递给简单查询时仍然收到错误消息。抱歉,如果其他地方有此问题的答案,但我找不到它

我有一个非常简单的表格:

select * from Test

产量

a
b
c

这很好用:

import pyodbc
import pandas
connection = pyodbc.connect('DSN=HyperCube SYSTEST',autocommit=True)
result = pandas.read_sql("""select * from Test where value = 'a'""",connection,params=None)
print(result)

结果:

  value
0     a

但是,如果我尝试使用带参数的 where 子句,它会失败

result = pandas.read_sql("""select * from Test where value = ?""",connection,params='a')

产量

Error: ('01S02', '[01S02] Unknown column/parameter value (9001) (SQLPrepare)')

我也试过了

cursor = connection.cursor()
cursor.execute("""select * from Test where value = ?""",['a'])
pyodbcResults = cursor.fetchall()

仍然收到同样的错误

有人知道发生了什么吗?会不会是我查询的数据库有问题?

PS。我查看了以下帖子,答案 9 的第一部分中的语法看起来与我正在做的相同

pyodbc sql 包含 0 个参数标记,但提供了 1 个参数''hy000'

谢谢

【问题讨论】:

标签: sql parameters pyodbc


【解决方案1】:

pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)[https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html]

params : list, tuple or dict, optional, default: None

示例:

cursor.execute("select * from Test where value = %s",['a'])

或命名参数示例:

result = pandas.read_sql(('select * from Test where value = %(par)s'),
               db,params={"par":'p'})

在pyodbc中直接在sql参数后面写parms:

cursor.execute(sql, *parameters)

例如:

onepar = 'a'
cursor.execute("select * from Test where value = ?", onepar)

cursor.execute("select a from tbl where b=? and c=?", x, y)

【讨论】:

  • 尽管所有 pyodbc 文档都说明要使用?,我也尝试了 %s 并收到了一条不同的错误消息,似乎表明 %s 不是有效标记:ProgrammingError: ('SQL 包含0 个参数标记,但提供了 1 个参数', 'HY000')
  • 谢谢,但不幸的是我也尝试了命名参数路由,但也收到了同样的错误:ProgrammingError: ('The SQL contains 0 parameter markers, but 1 parameters were provided', 'HY000')
  • 尝试了上面的确切代码(前两行)并得到了原始错误 - 这看起来很奇怪 - 我已经尝试了所有可能的示例,但我无法弄清楚:错误:('01S02' , '[01S02] 未知列/参数值 (9001) (SQLPrepare)')
  • con = pyodbc.connect('DSN=HyperCube SYSTEST',autocommit=True) cur = cnxn.cursor() cur.execute("""select * from Test where value = ?""", 'a') rows = cursor.fetchall()
猜你喜欢
  • 2019-04-15
  • 1970-01-01
  • 2013-08-02
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多