web-dev-qa-db-ja.com

Pythonを使用してCSVファイルをSQL Serverにインポートします

MS SQL ServerのテーブルにCSVファイルをアップロードできません。CSVファイルには25列あり、ヘッダーにはSQLのテーブルと同じ名前があり、25列あります。スクリプトを実行するとエラーが発生します

params arg (<class 'list'>) can be only a Tuple or a dictionary

このデータをMS SQLにインポートする最良の方法は何ですか? CSVとSQLの両方のテーブルには、まったく同じ列名があります。

これがコードです:

import csv
import pymssql

conn = pymssql.connect(
    server="xx.xxx.xx.90",
    port = 2433,
    user='SQLAdmin',
    password='xxxxxxxx',
    database='NasrWeb'
)

cursor = conn.cursor()
customer_data = csv.reader('cleanNVG.csv') #25 columns with same header as SQL

for row in customer_data:
    cursor.execute('INSERT INTO zzzOracle_Extract([Customer Name]\
      ,[Customer #]\
      ,[Account Name]\
      ,[Identifying Address Flag]\
      ,[Address1]\
      ,[Address2]\
      ,[Address3]\
      ,[Address4]\
      ,[City]\
      ,[County]\
      ,[State]\
      ,[Postal Code]\
      ,[Country]\
      ,[Category ]\
      ,[Class]\
      ,[Reference]\
      ,[Party Status]\
      ,[Address Status]\
      ,[Site Status]\
      ,[Ship To or Bill To]\
      ,[Default Warehouse]\
      ,[Default Order Type]\
      ,[Default Shipping Method]\
      ,[Optifacts Customer Number]\
      ,[Salesperson])''VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,)',row)

conn.commit()
cursor.close()
print("Done")
conn.close()

これは、CSVファイルの最初の行は次のようになります。

enter image description here

5
Cesar

d6tstack を試してみてください fast pandas to SQL functions ネイティブDBインポートコマンドを使用するため。PostgresとMYS​​QLで動作し、MS SQLは実験的です。動作しない場合は、コメントするか、問題を提起してください。

import pandas as pd
df = pd.read_csv('cleanNVG.csv')
uri_mssql = 'mssql+pymssql://usr:pwd@localhost/db'
d6tstack.utils.pd_to_mssql(df, uri_mssql, 'table', 'schema') # experimental

また、データスキーマが変更された複数のCSVをインポートしたり、pandasで前処理したりしてから、dbに書き込む前に、 example notes

d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'), 
    apply_after_read=apply_fun).to_mssql_combine(uri_psql, 'table')
4
citynorman

_csv.reader_を誤って使用しています。 _.reader_の最初の引数はCSVファイルへのパスではなく、

[an]反復子プロトコルをサポートし、その__next__()メソッドが呼び出されるたびに文字列を返すオブジェクト—ファイルオブジェクトとリストオブジェクトの両方が適切です。

したがって、 documentation の例によれば、次のようなことを行う必要があります。

_import csv
with open('cleanNVG.csv', newline='') as csvfile:
    customer_data = csv.reader(csvfile)
    for row in customer_data:
        cursor.execute(sql, Tuple(row))
_
1
Gord Thompson

テーブルのデータタイプと、各フィールドのサイズも確認してください。 varchar(10)で、データが20文字の場合、エラーがスローされます。

また、

クエリを動的に作成して、プレースホルダーの数がテーブルおよびCSVファイル形式と一致することを確認してください。次に、入力したことを確認するのではなく、テーブルとCSVファイルが正しいことを確認するだけです。コード内のプレースホルダー。

次の例では、

CSV file contains column names in the first line
Connection is already built
File name is test.csv
Table name is MyTable
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 dbo.Test 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()

ただし、基本的には、コードは問題なく見えます。以下は一般的なサンプルです。

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()
0
user7075507