Datenimport aus CSV in PostgreSQL

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Dienstag 17. Oktober 2006, 15:59

hy ich wollte aus einer CSV datei, die mehrere Spalten hat und 2 Werte pro Spalte arbeiten und die in ne Tabelle lesen .
Deutschland;0049
und so weiter ... hab dazu den Quelltext geschrieben

Code: Alles auswählen

import psycopg2 
import csv 
import datetime 


# Datenbank-Connection und -Cursor erstellen 
conn = psycopg2.connect(user = "tim", password = "changeme", database = "GB") 
cur = conn.cursor() 
# CSV-Datei öffnen
f = file("E:\AEP\destination.csv", "r") 

# CSV-Datei dem Parser übergeben 
csvdata = csv.reader(f, delimiter = ';') 

# Jede, nicht leere, Zeile durchlaufen 
for row in ( row for row in csvdata if row ): 
    # 
    # Daten vorbereiten (in den korrekten Datentyp umwandeln) 
    # 
    data = []
    data.append(row[0]) 
    data += [row[1]] 
    
    # Daten in DB schreiben 
    # 
    sql = """ 
    INSERT INTO call ( 
      name,
 dialcode 
    ) VALUES ( 
        %s,%s 
    ) 
    
     
      """ 
    
    conn.commit() 

# CSV-Datei schließen 
f.close() 
 
# Datenbankverbindung trennen 
conn.close()
und diese Datenbank

Code: Alles auswählen

CREATE TABLE destination
(
  identify serial NOT NULL,
  name varchar(50),
  destination varchar(50),
  CONSTRAINT destination_pkey PRIMARY KEY (identify)
) 
WITHOUT OIDS;
ALTER TABLE destination OWNER TO tim;

sieht einer einen Fehler, warum das Python tool mir nichts in meine Datenbank schreibt? Bin glaub ich gerade ziehmlich blind.
Oder diesen "data"befehl nicht drauf habe ??
Gruß Tim
BlackJack

Dienstag 17. Oktober 2006, 16:34

Du schreibst die Daten nicht in die Datenbank. Du musst die SQL-Anweisung auch ausführen und zwar mit der `execute()` Methode auf dem Cursor. Also ungefähr so:

Code: Alles auswählen

    cur.execute(sql, row)
`data` kannst Du ganz weglassen. `row` ist schon eine Sequenz von Werten.

Kommen in der CSV Datei Leerzeilen vor? Wenn nicht, dann kannst Du die ``for``-Schleife vereinfachen und den Generatorausdruck weglassen. Oder gleich die Schleife weglassen und `executemany()` benutzen.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Dienstag 17. Oktober 2006, 18:37

Hy,

Ergo:

Code: Alles auswählen

import psycopg2 
import csv 
import datetime 


# Datenbank-Connection und -Cursor erstellen 
conn = psycopg2.connect(user = "tim", password = "changeme", database = "GB") 
cur = conn.cursor() 
# CSV-Datei öffnen
f = file("E:\AEP\destination.csv", "r") 

# CSV-Datei dem Parser übergeben 
csvdata = csv.reader(f, delimiter = ';') 

 cur.execute(sql, row)
    
    # Daten in DB schreiben 
    # 
    sql = """ 
    INSERT INTO call ( 
      name,
 dialcode 
    ) VALUES ( 
        %s,%s 
    ) 
    
     
      """ 
    
    conn.commit() 

# CSV-Datei schließen 
f.close() 
 
# Datenbankverbindung trennen 
conn.close()
da es keine leeren zeilen gibt ???
BlackJack

Dienstag 17. Oktober 2006, 18:53

Nicht wirklich. Was ist denn hier `row`? Und Du benutzt `sql` *bevor* Du es an die Zeichenkette gebunden hast.

Wenn Du die Schleife nicht schreiben möchtest dann musst Du `executemany()` benutzen.

Code: Alles auswählen

cur.executemany(sql, csvdata)
Antworten