【问题标题】:pyodbc - cursor does not accept integer parameters when using python 3pyodbc - 使用 python 3 时游标不接受整数参数
【发布时间】: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


    【解决方案1】:

    所以...

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

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

    感谢所有查看我问题的人

    【讨论】:

      猜你喜欢
      • 2017-07-06
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2018-11-29
      • 2019-07-14
      • 2021-03-08
      • 2017-11-24
      相关资源
      最近更新 更多