こんにちは、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が存在することを確認しました。データ型は、渡すデータと一致しています。接続とカーソルも正しいです。行のデータ型は「リスト」です
プレースホルダの数がテーブルとCSVファイル形式に一致するように、クエリを動的に構築することを検討してください。次に、コードに?
プレースホルダーを十分に入力したかどうかをチェックするのではなく、テーブルとCSVファイルが正しいことを確認するだけです。
次の例では、
test.csv
ですMyTable
です...
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()
列を引数として渡すことができます。例えば:
for rows in csv_data: # Iterate through csv
cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)", *rows)
整理しました。このエラーは、テーブルのサイズ制限制限によるものでした。列の容量をcol1 varchar(10)からcol1 varchar(35)などに変更しました。現在は正常に機能しています。