2017-09-25 4 views
1

Ich lerne SQL Alchemy. Ich habe eine Liste von Spaltennamen aus einer CSV-Datei. Ich möchte Insert-Anweisungen für jede Zeile (oder eine einzelne Einfügung für alle Zeilen) erstellen. Bisher habe ichErstellen Sie ein Objekt einfügen

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

Das gerade druckt

INSERT INTO tablename() VALUES() 

für jede Zeile in der CSV-Datei.

Wie stelle ich die Spaltennamen und Werte korrekt zur Verfügung?

Antwort

2

Der Grund der kompilierte INSERT-Anweisung leer ist, wird durch zwei Dinge verursacht: die light weight table construct Sie verwendet haben, hat keine columns definiert, und die ersten drei Argumente insert() sind Tabelle, values und Inline - nicht Tisch, Spalten und Werte. Das Lesen der zugehörigen Dokumentation ist ein guter Anfang, wenn Probleme auftreten.

Ein SQLAlchemy-Insert-Konstrukt kann entweder nur durch passing it to execute, accompanied with the desired values oder als einzelne INSERT ... VALUES ...-Anweisung verwendet werden. So oder so, wenn Sie nicht volle Tabellentupel übergeben müssen, müssen Sie Wörterbücher der Spalte, Wertpaare übergeben:

+0

Ich versuche, große Mengen von sqlalchemy Docs heute zu verdauen. Also kann ich nur die Spaltennamen angeben und ihre Typen weglassen? –

+0

Ist '[dict (zip (columns, data)) für Daten im Reader]' eine Liste oder kann es ein Generator sein? –

+0

Zu Ihrer ersten Frage, wenn Sie die leichtgewichtigen 'table()' - und 'column()' -Konstrukte verwenden, ist der 'type_' nicht unbedingt erforderlich, wenn Sie geeignete Werte übergeben, die Ihr DB-API-Treiber in einer Art und Weise verarbeiten kann SQL, das in den Typ der Spalte und/oder den fraglichen Typ konvertierbar ist, erfordert keine spezielle bind/SQL-Verarbeitung. –

Verwandte Themen