Datenimport aus CSV in PostgreSQL

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

Datenimport aus CSV in PostgreSQL

Beitragvon BoOnOdY » 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

Beitragvon 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

Beitragvon BoOnOdY » 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

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder