Панды to_sql возвращает cx_Oracle.DatabaseError: ORA-00942: таблица или представление не существует - PullRequest
1 голос
/ 05 апреля 2019

Панды to_sql не работает.

Я инициализирую свой движок с помощью sqlalchemy. Я также импортировал cx_Oracle на всякий случай. Для целей тестирования я использовал пример кода, предоставленный документацией pandas.DataFrame.to_sql. Ниже приведен пример:

import pandas as pd
from sqlalchemy import create_engine
import cx_Oracle

# specify oracle connection string
oracle_connection_string = (
    'oracle+cx_oracle://{username}:{password}@' +
    cx_Oracle.makedsn('{hostname}', '{port}', service_name='{service_name}')
)

# create oracle engine
engine = create_engine(
    oracle_connection_string.format(
        username='username',
        password='password',
        hostname='aaa.aaa.com',
        port='1521',
        service_name='aaa.aaa.com',
    )
)

# test to_sql
# Create a table from scratch with 3 rows
df = pd.DataFrame({'name' : ['User 1', 'User 2', 'User 3']})
df.to_sql('schema.table_name', con=engine, if_exists='replace', index_label='id')
engine.execute("SELECT * FROM schema.table_name").fetchall()

Если таблица не была создана в первую очередь, я получу ошибку «ORA-00942: таблица или представление не существует». В противном случае я просто получу пустой список.

К вашему сведению, я протестировал функцию read_sql, и она работает. Другой подход, который я попробовал, состоит в том, чтобы указать схему в выражении параметра, пожалуйста, обратитесь к ссылкам в разделе комментариев.

Согласно моему пониманию, sqlalchemy также вызывает cx_Oracle. Тем не менее, вставка с использованием cx_Oracle работает.

Просто хочу знать, сталкивался ли кто-нибудь с этим раньше. Спасибо.

1 Ответ

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

Pandas назвал вашу таблицу schema.table_name в вашей схеме по умолчанию (с использованием заключенного в кавычки идентификатора), а не в таблице table_name в схеме schema. Используйте ключевое слово аргумент schema, чтобы определить его:

df.to_sql('table_name', schema='schema', con=engine, if_exists='replace', index_label='id')

Я предполагаю, что вы передали схему и имя таблицы аналогично read_sql, как вы это сделали to_sql, так что это сработало, потому что указало идентификатор, а ваш необработанный запрос - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...