早安,
当我对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
下面是一些代码片段。
用于创建数据库连接对象并将游标对象声明为类变量的代码:
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的SQL查询中使用非字符串参数时,我的选择查询遇到了问题。我当前的环境:Windows Server 2016(64位)Python 3(64位)通过...
所以...