web-dev-qa-db-fra.com

Écriture d'un fichier csv dans une base de données SQL Server à l'aide de python

Bonjour, j'essaie d'écrire un fichier csv dans une table de la base de données SQL Server à l'aide de python. Je fais face à des erreurs lorsque je passe les paramètres, mais je ne fais face à aucune erreur lorsque je le fais manuellement. Voici le code que je suis en train d'exécuter.

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

Erreur: pyodbc.DataError: ('22001', '[22001] [Microsoft] [Pilote ODBC SQL Server] [SQL Server] Une chaîne ou des données binaires sont tronquées. [Microsoft] [Pilote ODBC SQL Server] [SQL Server] L'instruction est terminée. (3621) ')

Cependant, lorsque j'insère les valeurs manuellement. Ça fonctionne bien

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

Je me suis assuré que le TABLE est là dans la base de données, les types de données sont cohérents avec les données que je transmets. La connexion et le curseur sont également corrects. Le type de données des lignes est "list"

11
NG_21

Pensez à créer la requête de manière dynamique pour vous assurer que le nombre d'espaces réservés correspond à votre table et au format de fichier CSV. Ensuite, il vous suffit de vous assurer que votre table et votre fichier CSV sont corrects, au lieu de vérifier que vous avez saisi suffisamment d'espaces réservés ? dans votre code.

L'exemple suivant suppose

  1. Le fichier CSV contient des noms de colonne dans la première ligne
  2. La connexion est déjà établie
  3. Le nom du fichier est test.csv
  4. Le nom de la table est 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()

Si les noms de colonne ne sont pas inclus dans le fichier:

...
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()
26
Bryan

Avez-vous essayé de passer les colonnes comme arguments pour, par exemple,.

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

Merci à tous, je l'ai réglé. L'erreur était due à la restriction de taille de la table. Il a changé la capacité de la colonne, passant de col1 varchar (10) à col1 varchar (35), etc.

@beargle: J'ai vraiment aimé votre façon de le programmer 

0
NG_21