web-dev-qa-db-ja.com

pythonを使用してcsvファイルをSQL Serverデータベースに書き込む

こんにちは、Pythonを使用してSQL Serverデータベースのテーブルにcsvファイルを書き込もうとしています。パラメータを渡すとエラーに直面しますが、手動でエラーに直面することはありません。これが私が実行しているコードです。

cur=cnxn.cursor() # Get the cursor
csv_data = csv.reader(file(Samplefile.csv')) # Read the csv
for rows in csv_data: # Iterate through csv
    cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)",rows)
cnxn.commit()

エラー:pyodbc.DataError:( '22001'、 '[22001] [Microsoft] [ODBC SQL Server Driver] [SQL Server] Stringまたはバイナリデータは切り捨てられます。( 8152)(SQLExecDirectW); [01000] [Microsoft] [ODBC SQL Server Driver] [SQL Server]ステートメントは終了しました。(3621) ')

ただし、値を手動で挿入すると。うまくいく

cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)",'A','B','C','D')

データベースにTABLEが存在することを確認しました。データ型は、渡すデータと一致しています。接続とカーソルも正しいです。行のデータ型は「リスト」です

13
NG_21

プレースホルダの数がテーブルとCSVファイル形式に一致するように、クエリを動的に構築することを検討してください。次に、コードに?プレースホルダーを十分に入力したかどうかをチェックするのではなく、テーブルとCSVファイルが正しいことを確認するだけです。

次の例では、

  1. CSVファイルの最初の行に列名が含まれています
  2. 接続はすでに構築されています
  3. ファイル名はtest.csvです
  4. テーブル名はMyTableです
  5. Python 3
...
with open ('test.csv', 'r') as f:
    reader = csv.reader(f)
    columns = next(reader) 
    query = 'insert into MyTable({0}) values ({1})'
    query = query.format(','.join(columns), ','.join('?' * len(columns)))
    cursor = connection.cursor()
    for data in reader:
        cursor.execute(query, data)
    cursor.commit()

列名がファイルに含まれていない場合:

...
with open ('test.csv', 'r') as f:
    reader = csv.reader(f)
    data = next(reader) 
    query = 'insert into MyTable values ({0})'
    query = query.format(','.join('?' * len(data)))
    cursor = connection.cursor()
    cursor.execute(query, data)
    for data in reader:
        cursor.execute(query, data)
    cursor.commit()
31
Bryan

列を引数として渡すことができます。例えば:

for rows in csv_data: # Iterate through csv
    cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)", *rows)
0
arocks

整理しました。このエラーは、テーブルのサイズ制限制限によるものでした。列の容量をcol1 varchar(10)からcol1 varchar(35)などに変更しました。現在は正常に機能しています。

0
NG_21