2017-08-29 4 views
2

Je suis un peu nouveau à coder et je suis coincé. Je tire un rapport à travers une API qui me donne un fichier. Csv. Je veux coller cela dans une base de données SQL, mais je rencontre des problèmes.Échapper des noms de colonnes en écrivant à SQL avec python, pyodbc de csv

Mon code actuel ressemble à ceci: lecteur

est le fichier csv décodé.

columns = next(reader,None) 
query = "INSERT INTO table({0}) VALUES ({1})" 
query = query.format(','.join(columns),','.join('?'*len(columns))) 
cursor = cnxn.cursor() 
cursor.execute(query, columns) 
for data in reader: 
    cursor.execute(query, data) 
cursor.commit() 

Quand je lance le code je reçois cette erreur:

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near the keyword 'Group'. (156) (SQLExecDirectW)")

Je pense que le problème est que mes colonnes sont:

Date | Advertiser | Campaign | Ad Group | etc. 

Et il semble que SQL est peut-être reconnaître la "Groupe" de "Groupe d'annonces" en tant que variable

Des idées? Je vous remercie.

+1

Ce n'est pas qu'il le reconnaît comme une variable - c'est qu'il ne peut pas l'interpréter à cause de l'espace dans le nom de la colonne. Vous auriez besoin de mettre un nom de colonne comme cela entre crochets pour que SQL Server l'interprète (et en général c'est une bonne idée d'inclure tous les noms de colonne entre crochets) - donc au lieu de 'insert into table (date, annonceur, campagne, groupe d'annonces) 'cela devrait être' insérer dans la table ([date], [annonceur], [campagne], [groupe d'annonces]) ' – ZLK

+0

@ZLK Merci beaucoup. Ça a marché. Maintenant, il semble que mes données apparaissent comme une chaîne "La conversion a échoué lors de la conversion de la date et/ou de l'heure de la chaîne de caractères." Y a-t-il une solution rapide pour cela aussi par hasard? – Jamesdabeard

+0

Um, cela dépend de ce à quoi ressemblent vos données. À quoi ressemble le champ Date? – ZLK

Répondre

3

Comme mentionné dans un commentaire de @ZLK, vous devez placer les noms de colonnes entre crochets. Cela fera l'affaire:

query = query.format('[{0}]'.format('], ['.join(columns)),','.join('?'*len(columns))) 
+0

Cela fonctionnera uniquement si vos noms de colonne ne contiennent pas eux-mêmes de crochets. Si vous voulez être plus sûr, vous devrez également remplacer ']' par ']]' dans vos noms de colonnes dynamiques avant de les placer entre crochets. Cela empêchera l'injection SQL ET vous permettra d'avoir de vraies parenthèses dans les noms de colonnes. – Tim