2017-11-28 28 views
1

私は新しいoracle学習者です。私はpandasデータフレームをoracleテーブルに書き込もうとしています。私はオンラインで研究を行った後、コード自体が非常にシンプルだとわかりましたが、私のコードがなぜ機能しないのか分かりません。to_sqlを使用してpandasデータフレームをOracleデータベースに書き込む方法は?

私は私のローカルファイルからパンダのデータフレームを読みました:その後、私は使用して、データベースとの接続を作成

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  

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は、このようなことSHOLD、dfを印刷cx_Oracle、それは動作します。次に、データフレームdfをテーブルTESTに書き込もうとします。この表TESTは、Oracleデータベースにすでに存在する空の表であり、OracleにDATE、YEAR、MONTH、SOURCE、DESTINATIONなどの列があります。すべてのデータ型がdfサンプルデータと一致します。次のように私のコードは次のとおりです。

conn_str = u'account/[email protected]: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: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ORA-01036: illegal variable name/number

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

答えて

0

これはよく似た質問です.cx_Oracleで作成された接続オブジェクトを使用してOracle DBに書き込むと発生します。

SQL錬金術を使用して接続を作成してください:あなたは返信用

import cx_Oracle 
from sqlalchemy import types, create_engine 

conn = create_engine('oracle+cx_oracle://scott:[email protected]:1521/?service_name=hr') 

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

ありがとうございました。 ORA-01950:表領域 'xxx_DATA'に対する権限がありません。(SQL: 'INSERT INTO' TEST '( "索引"、 "日付"、 "年"、 "月"、 ...)VALUE(: "index"、: "DATE"、:YEAR、...)] –

+0

@HavenShi、これは別の話です。つまり、あなた(またはあなたのDBA)はそのoracleユーザーのためにその表スペースにクォータを追加する必要があります。私はあなたの元の質問に答えていると思う;-) – MaxU

+0

、あなたはテーブルスペースについてもう少し説明できますか?私はOracleテーブルTESTに直接書き込むことができます。何が恋しいですか? –

関連する問題