Не удается получить доступ к базе данных Oracle с помощью sqlalchemy - PullRequest
0 голосов
/ 04 апреля 2019

Я знаю, что этот вопрос задавался несколько раз - особенно в этот вопрос , но мне не удалось решить мою проблему.В обоих приведенных ниже фрагментах установлены cx_Oracle и sqlalchemy

import cx_Oracle
from sqlachemy import create_engine

Я пытаюсь подключить / записать кадр данных pandas в базу данных Oracle.Мне удалось записать в базу данных, используя следующий фрагмент кода:

ora_con = cx_Oracle.connect("{}/{}@{}".format(schema_name, password, name_of_service))
cur = ora_con.cursor()
statement='CREATE TABLE '+schema_Name+'.History (Name VARCHAR2(15), Entity VARCHAR2(15), Status VARCHAR2(25), Type VARCHAR2(25), Owner VARCHAR2(15), User_521 VARCHAR2(15), Manufacturer  VARCHAR2(15), Model  VARCHAR2(15), FusInv_Last_inventory DATE, Serial_Number  VARCHAR2(25), ID VARCHAR2(15), Version_of_OS  VARCHAR2(15), OS  VARCHAR2(15), Date_of_Report DATE)'
cur.execute(statement)

Это работает.

Когда я пытаюсь:

con_str = """oracle+cx_oracle://schema_name:password@Host_address:port/?service_name=name_of_service"""
engine = create_engine(con_str, echo=False)
pandasDataframe.to_sql('History', engine ,  index = False) # Insert the values from the INSERT QUERY into the table 'History'

Сбой команды pandas .to_sql с ошибкой cx_Oracle: cx_Oracle.DatabaseError: ORA-12569: TNS: ошибка контрольной суммы пакета

Поиск ошибки в Google указывает на сетевую ошибку (сеть в порядке) или ошибку слушателя (номер порта, но это тоже хорошо)

Я могу подключиться, написать и прочитать базу данных в SQL Developer.

* 1019Есть какие-нибудь мысли?Заранее спасибо ...

1 Ответ

0 голосов
/ 05 апреля 2019

Ваша простая строка подключения cx_Oracle отличается от строки sqlalchemy. Обратите внимание, что sqlalchemy использует cx_Oracle.makedsn(). Так что если у вас есть этот синтаксис подключения с простым cx_Oracle:

cx_Oracle.connect('myuser/mypassword@myhost:myport/myservice')

вам понадобится этот синтаксис для sqlalchemy:

con_str = 'oracle+cx_oracle://myuser:mypassword@myhost:myport/?service_name=myservice'
...