【发布时间】:2020-04-06 23:32:36
【问题描述】:
早安,
当我通过 pyodbc 对我的 SQL 查询使用非字符串参数时,我的选择查询出现问题。
我现在的环境:
Windows Server 2016(64 位)
通过 Anaconda 2018.12 的 Python 3(64 位)/通过 Anaconda 5.1.0 的 Python 2(32 位)
oracle 12 odbc 驱动程序(64 位)/oracle 11 odbc 驱动程序(32 位)
数据库:Oracle 11g
pyodbc 版本 4.0.25
下面是一些代码sn-ps。
创建数据库连接对象并将游标对象声明为类变量的代码:
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 在调试我的代码方面也没有多大帮助。
我可以从这里去哪里?
谢谢
【问题讨论】:
标签: python python-3.x oracle oracle11g pyodbc