Добрый день,
У меня возникают проблемы с моими запросами выбора, когда я использую нестроковые параметры для моих 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 отсюда?
Спасибо