Как записать pandas dataframe в базу данных oracle с помощью to_sql?

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

Я прочитал кадр данных панд из моего локального файла:

import cx_Oracle
import pandas as pd
import os

dir_path = os.path.dirname(os.path.realpath("__file__"))
df = pd.read_csv(dir_path+"/sample.csv")

Теперь выведите df, датафрейм df должен выглядеть так:

   DATE            YEAR     MONTH      SOURCE      DESTINATION
0  11/1/2017 1:00  2017     1          AL          CO  
1  11/2/2017 1:00  2017     5          GA          ID  
2  11/3/2017 1:00  2017     12         GA          MO    

Затем я создаю соединение с базой данных с помощью cx_Oracle, это работает. Затем я пытаюсь записать фрейм данных df в таблицу TEST. Эта таблица TEST представляет собой пустую таблицу, которая уже существует в базе данных oracle, и в ней есть столбцы, включающие DATE, YEAR, MONTH, SOURCE, DESTINATION в oracle. Все типы данных соответствуют образцу данных df. Мой код выглядит следующим образом:

conn_str = u'account/password@host:1521/server'
conn = cx_Oracle.connect(conn_str)

# Write records stored in a DataFrame to a oracle database
df.to_sql('TEST', conn, if_exists='replace') # the error shows here

conn.close()

Это показывает ошибку:

DatabaseError: Ошибка выполнения на sql 'ВЫБЕРИТЕ имя ОТ sqlite_master WHERE тип =' таблица 'И имя =?;': ORA-01036: недопустимое имя / номер переменной

Как решить проблему? Большое спасибо за уделенное время!

3 ответа

Решение

Я видел похожие вопросы о SO - это происходит, когда вы пытаетесь записать в Oracle DB с помощью объекта подключения, созданного cx_Oracle,

Попробуйте создать соединение с помощью SQL Alchemy:

import cx_Oracle
from sqlalchemy import types, create_engine

conn = create_engine('oracle+cx_oracle://scott:tiger@host:1521/?service_name=hr')

df.to_sql('TEST', conn, if_exists='replace')

Я могу загрузить таблицу Oracle, используя следующий код:

      import pandas as pd
import os

creds = {}
creds['tns_admin'] = 'Wallet_Path'
creds['sid'] = 'dev_low'
creds['user'] = 'username'
creds['password'] = pwd

os.environ['TNS_ADMIN'] = creds['tns_admin']


uri = 'oracle+cx_oracle://' + creds['user'] + ':' + creds['password'] + '@' + creds['sid']
df = pd.read_csv("test.csv")
df.to_sql('test', uri, schema='PRD', if_exists='replace')

Вместо соединения нам нужно создать и передать URI.

Примечание . Для новых баз данных Oracle (автономных) требуется кошелек, поэтому нам нужно указать путь к кошельку в переменной среды TNS_ADMIN.

Кроме того, мне не нужно было импортировать cx_Oracle, я дважды проверял, что

Чтобы меня не обманули, я уронил таблицу и зафиксировал

И я выполнил приведенный выше код, он создал новую таблицу с данными.

После обращения к этому решению я смог сделать это, выполнив следующие шаги.

      from sqlalchemy.engine import create_engine

DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = 'your_username' 
PASSWORD = 'your_password'
HOST = 'subdomain.domain.tld' 
PORT = 1521 
SERVICE = 'your_oracle_service_name'
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE

engine = create_engine(ENGINE_PATH_WIN_AUTH)

После успешного создания движка SQLAlchemy вы можете передать его пандам. to_sql()функция.

      df.to_sql('name_of_sql_table',engine,schema='your_schema')
Другие вопросы по тегам