2017-09-25 6 views
1

J'apprends l'alchimie SQL. J'ai une liste de noms de colonnes d'un fichier CSV. Je veux créer des instructions d'insertion pour chaque ligne (ou un seul insert pour toutes les lignes). Jusqu'à présent, j'aiCréer un objet Insérer

with open('tablename.csv', 'r') as f: 
    reader = csv.reader(f) 
    columns = next(reader) 

    for data in reader: 
     query = insert(table(table_name), columns, data) 
     print(str(query)) 

Cette juste imprime

INSERT INTO tablename() VALUES() 

pour chaque ligne dans le fichier CSV.

Comment fournir correctement les noms et les valeurs des colonnes?

Répondre

2

La raison pour laquelle l'instruction INSERT compilé est vide est causée par 2 choses: le light weight table construct que vous avez utilisé n'a pas columns défini et les 3 premiers arguments à insert() sont table, values, et en ligne - pas de table, des colonnes et valeurs. La lecture de documentation connexe est un bon début en cas de problème.

Une construction d'insertion SQLAlchemy peut être utilisée soit par passing it to execute, accompanied with the desired values, soit par une instruction INSERT ... VALUES .... De toute façon, sinon passer tuples pleine de table, vous devez passer des dictionnaires de la colonne, des paires de valeur:

tbl = table(table_name, *(column(c) for c in columns)) 
values = [dict(zip(columns, data)) for data in reader] 

# A single INSERT statement with multiple values 
stmt = insert(tbl).values(values) 
engine.execute(stmt) 

# More traditional executemany 
engine.execute(insert(tbl), values) 
+0

Je suis en train de digérer de grandes quantités de documents sqlalchemy aujourd'hui. Donc, je peux spécifier seulement les noms de colonnes et peut laisser de côté leurs types? –

+0

Est-ce que '[dict (zip (colonnes, données)) pour les données dans le lecteur]' doit être une liste ou peut-il être un générateur? –

+0

Pour votre première question, lorsque vous utilisez les constructions légères 'table()' et column() ', le type_ n'est pas nécessairement obligatoire si vous transmettez des valeurs appropriées que votre pilote DB-API peut gérer de manière à produire SQL convertible en type de colonne et/ou le type en question ne nécessite aucun traitement spécial bind/SQL. –