3

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 文字を調査しています。どんな助けでも大歓迎です。

4

1 に答える 1

3

ユニコードが全体の問題だったようです。for ループで使用print type(EMPLOYEE)し、従業員名が Unicode でエンコードされていることを確認しましたが、データベースは単純に ASCII 文字列を想定していました。関数を使用して値を変換したところstr()、すべてが正しく機能しました。これの唯一の欠点は、str()実際に従業員名に Unicode 文字が含まれているとコマンドがエラーをスローすることです。そのため、文字列を実際に変換して Unicode 文字を処理することをすぐに検討します。

于 2013-10-24T15:25:24.740 に答える