Excel ドキュメントからデータを読み取り、それを Oracle データベースの単一のテーブルに書き込む Python スクリプトを作成しようとしています。現在xlrd
、Excel ドキュメントから読み取りcx_Oracle
、データをデータベースに挿入するために使用しています。
以前は、ネストされた for ループ構造を使用して、Excel ドキュメントのすべての列を調べ、各列の値を変数に格納し、値をテーブルに挿入してから、すべての行に対してこれを行っていました。ただし、これは数千行のデータではかなり非効率的であり、executemany()
cx_Oracle を使用したステートメントを使用して実行しようとしています。
現在、このコードを使用してデータをリストのリストにロードし、executemany() コマンドを呼び出しています。
rows = []
for rownum in range (sh1.nrows):
column_value = sh1.row_values(rownum)
EMPLOYEE = column_value[1]
ITEM_DATE = column_value[2]
HOURS = column_value[3]
row = [EMPLOYEE, ITEM_DATE, HOURS]
rows.append(row)
query ="""INSERT INTO TABLE1 (EMPLOYEE, ITEM_DATE, HOURS) VALUES (:1, :2, :2)"""
# executemany by passing list rows with tuples (EMPLOYEE, ITEM_DATE, HOURS)
cursor.executemany(query, rows)
行リストは次のようになります。
[[u'Employee 1', 10000.0, 8.0], [u'Employee 1', 10001.0, 8.0], [u'Employee 1', 10002.0, 8.0]....]
# I have disguised the names and numbers here
ただし、executemany() ステートメントの実行時に型エラーが発生します。
cursor.executemany(query, rows)
TypeError: expecting string, unicode or buffer object
(データ読み取りの最後の行に単一の挿入を行う)を実行すると、クエリは完全に正常に実行cursor.execute(query, row)
されるため、クエリ文字列ではなく、パラメーターのリストのフォーマット方法に問題があると思います。ただし、このチュートリアルに従って、パラメーターは正しくフォーマットされているように見えますが、コードが機能しない理由を理解してくれる人はいますか?
更新:そこで、変数にデータを手動で挿入してrows
、フォーマットがオフになっているかどうかを確認し、Unicode 文字を削除しようとしました:
rows = [['Employee 1', 10000.0, 8.0], ['Employee 1', 10001.0, 8.0], ['Employee 1', 10002.0, 8.0]]
これら 3 つのエントリを挿入すると問題なく動作したため、現在、問題の原因として Unicode 文字を調査しています。どんな助けでも大歓迎です。