web-dev-qa-db-ja.com

to_sqlを使用してOracleデータベースにpandasデータフレームを書き込む方法は?

私は新しいOracle学習者です。 pandasデータフレームをOracleテーブルに書き込もうとしています。オンラインで調査した後、コード自体は非常に簡単であることがわかりましたが、コードがなぜ仕事。

ローカルファイルからpandasデータフレームを読み取りました。

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データベースにすでに存在する空のテーブルです。Oracleには、DATE、YEAR、MONTH、SOURCE、DESTINATIONなどの列があります。すべてのデータ型は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 'SELECT name FROM sqlite_master WHERE type =' table 'AND name = ?;'で実行に失敗しました:ORA-01036:無効な変数名/番号

問題を解決する方法は?お時間をありがとうございました!

5
Haven Shi

SO--_cx_Oracle_で作成された接続オブジェクトを使用してOracle DBに書き込もうとすると発生します。

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')
_
7
MaxU