pyodb c - курсор не принимает целочисленные параметры при использовании python 3 - PullRequest
1 голос
/ 07 апреля 2020

Добрый день,

У меня возникают проблемы с моими запросами выбора, когда я использую нестроковые параметры для моих SQL запросов с pyodb c.

Моя текущая среда:

  • Windows Сервер 2016 (64-разрядный)

  • Python 3 (64-разрядный) через Anaconda 2018.12 / Python 2 (32-разрядный) через Anaconda 5.1.0

  • oracle 12 odb c драйвер (64-разрядный) / oracle 11 odb c драйвер (32-разрядный)

  • База данных: Oracle 11g

  • pyodb c версия 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!')

Если я объявлю my param переменная в виде строки:

    param = '1'

Треска e будет работать как обычно.

Табличные данные для справки:

TEST_TABLE

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

Что я сузил из-за моего устранения неполадок, так это то, что эта проблема касается только python 3 запросов кода Oracle баз данных , Драйверы ODB C, как представляется, не являются проблемой, ни битовая сущность python.

Я мог бы преобразовать все свои параметры в виде строки для моих существующих запросов, но я бы хотел воздержаться делать это, если это возможно. PDB также не сильно помог мне в отладке моего кода.

Где я могу go отсюда?

Спасибо

1 Ответ

2 голосов
/ 07 апреля 2020

Итак ...

Оказывается, что старая версия pyodb c была проблемой. Обновление с 4.0.25 до 4.0.30 для пакета pyodb c в Anaconda устранило проблему.

Я не изменяю базовую установку пакета anaconda, поэтому похоже, что я буду использовать какая-то виртуальная среда.

Спасибо всем, кто просмотрел мой вопрос

...