pyodbc-游标在使用python3时不接受整数参数



你好,

当我使用pyodbc对SQL查询使用非字符串参数时,我的选择查询出现问题。

我当前的环境:

  • Windows Server 2016(64位(

  • Python 3(64位(通过Anaconda 2018.12/Python 2(32位(通过Anaconda 5.1.0

  • oracle 12 odbc驱动程序(64位(/oracle 11 odbc驱动软件(32位(

  • 数据库:Oracle 11g

  • pyodbc 4.0.25版

下面是一些代码片段。

用于创建数据库连接对象并将游标对象声明为类变量的代码:

class DB_Oracle(object):
"""Database connections for Oracle Databases.
"""
def __init__(self, Target="test"):
"""Connect to the target database and create a cursor for doing queries.
"""
if Target == "test":
if platform.architecture()[0] == "64bit":
self.DatabaseDriver = "{Oracle in OraClient12Home1}"
else:
self.DatabaseDriver = "{Oracle in OraClient11g_home1}"
self.DatabaseUser = #omitted
self.DatabasePassword = #omitted
self.HostName = #omitted
self.Port = "1521"
self.SID = #omitted
self.DBQ = self.HostName + ":" + self.Port + "/" + self.SID
print("            - Assyst: Connecting to "+self.HostName+" with driver "+self.DatabaseDriver)
try:
self.dbconnection = pyodbc.connect(
"DRIVER=" + self.DatabaseDriver +
";DBQ=" + self.DBQ + 
";UID=" + self.DatabaseUser + 
";PWD=" + self.DatabasePassword)
self.cursor = self.dbconnection.cursor()
print("            - Connection completed: " + str(Target))
except:
print("** ERROR: Can not create connection to: " + str(Target))
else:
print("** ERROR: The requested target Database is unknown: " + str(Target))
return(None)

查询所述数据库的示例代码:

if __name__=='__main__':
db_conn = DB_Oracle(Target="test")
sql_query = "SELECT * from TEST_TABLE WHERE TEST_ID = ?"
param = 1
db_conn.cursor.execute(sql_query, param)
print(db_conn.cursor.fetchall())
db_conn.cursor.close()

如果我使用的是Python 2,上面的代码会起作用,但如果我使用Python 3,就会失败。它将吐出以下错误:

Error: ('HY000', 'The driver did not supply an error!')

如果我将param变量声明为字符串:

param = '1'

代码将正常执行。

表数据供参考:

TEST_TABLE
TEST_ID | TEST_NAME
-------------------
1       | 'test1' 
2       | 'test2' 
3       | 'test3' 
4       | 'test4' 

我通过故障排除缩小了范围,这个问题只影响查询Oracle数据库的python 3代码。ODBC驱动程序似乎不是问题所在,也不是python的问题所在。

我可以将所有参数强制转换为现有查询的字符串,但如果可能的话,我希望不要这样做。PDB在调试代码方面对我也没有多大帮助。

我从这里可以去哪里?

谢谢

所以。。。

原来问题出在旧版本的pyodbc上。在Anaconda中对pyodbc包从4.0.25更新到4.0.30解决了这个问题。

我宁愿不修改anaconda包的基本安装,这样看起来我会使用某种虚拟环境。

感谢所有看过我的问题的人

最新更新