Datenimport in PostgreSQL datenbank mit Hilfe von Phyton

Code-Stücke können hier veröffentlicht werden.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hy, hab keinen Bereich gefunden in den das wirklich rien passt, hoffe ich hab das hier net zu weit ab vom Schuss gepostet.

Naja auf jedenfall.
Ich bin gerade dabei mit Python anzufangen und möchte ein paar daten daten über ein Python programm in eine PostrgeSQL datenbank mit einer festen prozedur importieren.
die Datensätze sind ne Mänge in einer .txt vertaut und haben alle das gleiche Format und sind immer mit einem Enter voneinander getrennt
09.05.2006;16:57:56:322;5;1;442075194600;496663918522;111039;CAU_NCC
09.05.2006;17:00:54:969;5;1;;552227342758;;CAU_NCC
und die müssten immer in ne datenbank eingespielt werden.


Kann mir vieleicht jemand ein Tutorial link geben oder so? weil ich hab noch nix großartiges gefunden und vieleicht kann mir ja auch jemand den quelltext schreiben und erklären.

Ich denk ma man muss zu der database verbinden und dann irgendwie das ganze in ne Schleife einbauen, aber wie is die syntax dazu in Phyton?

Danke schon ma für jedes Lesen und noch mehr für jede Antwort

Tim
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Code: Alles auswählen

f = open('mytextfile.txt', 'r')
text = f.readlines()
for line in text:
    date, time, i1, i2, l1, l2, i3, s1 = line.split(';')
Nachher kannst du das irgend wie in deine Datenbank speichern ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BoOnOdY hat geschrieben:in eine PostrgeSQL datenbank
Hi Tim!

Dieser Link hilft dir zumindest schon mal beim Installieren von "Psycopg2", was auf jeden Fall eine Empfehlung als Schnittstelle für den Zugriff auf PostgreSQL ist:
http://www.python-forum.de/topic-6618.html

Hier noch ein kleines Tutorial:
http://www.initd.org/tracker/psycopg/wi ... rogramming

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Tim!

Zum Auslesen und Schreiben von CSV-Dateien gibt es in Python ein eigenes Modul.

Siehe diese Links:
- http://www.python-forum.de/post-38057.html#38057
- http://docs.python.org/lib/module-csv.html
- http://docs.python.org/lib/node636.html
- http://www.python-forum.de/topic-6169.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

hey danke, mit psycopg2 hab ich im Ramen von Zope schon experimentiert, kann man das etwa auch außerhalb von zope nutzen?

oder noch besser, wie würde denn der quelltext aussehen, wenn ich das mit zope ,machen will?

also so ne seite mit nem button, und vieleicht später noch so nem Durchsuchen feld, wo ich dann den Pfad angeben kann, das wär bestimmt ma ne coole Sache

gruß tim
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BoOnOdY hat geschrieben:hey danke, mit psycopg2 hab ich im Ramen von Zope schon experimentiert, kann man das etwa auch außerhalb von zope nutzen? oder noch besser, wie würde denn der quelltext aussehen, wenn ich das mit zope ,machen will?
Hi Tim!

Den "Quelltext" musst du dir schon selber schreiben. ;-)

Ja, psycopg2 ist die eigentliche Python-PostgreSQL-Schnittstelle. Zope greift einfach darauf zu. Allerdings muss man psycopg2 für das normale Python (das nicht in Zope integriert ist) extra installieren.

Für Windows: Einfach die Datei http://www.stickpeople.com/projects/pyt ... -py2.4.exe herunterladen und ausführen. Natürlich sollte vorher Python 2.4.x installiert sein.

Danach kannst du von Python aus auf PostgreSQL-Datenbanken zugreifen.
Wie das geht, verrät dir das Tutorial auf das ich dich bereits hingewiesen habe. http://www.initd.org/tracker/psycopg/wi ... rogramming

Für Allgemeines zum Thema SQL: Suche einfach mal hier im Forum nach "SQL". Viele Anleitungen zu MySQL gelten ohne große Änderung meist auch für PostgreSQL.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

gerold hat geschrieben:Für Allgemeines zum Thema SQL: Suche einfach mal hier im Forum nach "SQL".
Hi!

SQL wird dir hier recht gut erklärt:
http://www.postgresql.org/files/documen ... l-sql.html
http://www.postgresql.org/docs/books/pghandbuch.html.de

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

ja danke:)
dann werd ich mich da ma durchboxen ;)
ein sql Buch hab ich mir schon selbst besorgt, hab halt nur das Problem, das das immer nur einzelne Daten einlesen mag mit der Import funktion und net nen ganzen Rutsch aus ner csv, aber mit hilfe der Tutorials usw. versuch ich ma so was anzufangen.

Noch ne letzte Frage, wenn ich dann mit phyton ne database connection hab, kann ich dann einfach die normalen SQL befehle nutzen?
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hey, kann ich bitte mal ein konkretes Beispiel dafür haben wenn ich dem sagen will, dass er die datei einlesen soll, und in eine SQL datenbank schreiben... so spontan würd ich sagen ,üsste das so aussehen:

Code: Alles auswählen

import psycopg
import csv
reader = csv.reader(open("some.csv", "r"))
conn= connect ('dbname=test user=tim pw=1234')
curs= conn.cursor()

soo und wie bestimme ich jetzt, dass er ausließt, bis zu einem semikolon und dann das ganze in eine sql datenbank packt?
müsste ja dann weitergehen (wenn schon mit popy eine verbindung zu der sql datenbank hergestellt ist)

Code: Alles auswählen

Curse.ececute(
       "Insert into test
       (datum, zahl, zahl, bezeichnung)
        values
       ( ?, ?, ?, ?)"
)
muss ich die ausgelesenen sachen in variablen packen oder kann ich die irgendwie einfach so in values übergeben?
wiederholt sich die prozedur von alleine bis die ganze CSV ausgelesen ist?
ist das CSV modul von vorneherein in python bei der installation dabei?
muss ich popy im python scirpt noch erwähnen oder reicht es, wenn es bei zope mit der database verbunden ist?


Freu mich schon auf die Antworten :)

Tim
BlackJack

BoOnOdY hat geschrieben:Hey, kann ich bitte mal ein konkretes Beispiel dafür haben wenn ich dem sagen will, dass er die datei einlesen soll, und in eine SQL datenbank schreiben... so spontan würd ich sagen ,üsste das so aussehen:

Code: Alles auswählen

import psycopg
import csv
reader = csv.reader(open("some.csv", "r"))
conn= connect ('dbname=test user=tim pw=1234')
curs= conn.cursor()
Das Argument bei `connect()` ist falsch und `connect` ist eine Funktion im `psycopg` Modul. Die Argumente müssen nicht als eine Zeichenkette angegeben werden, sondern als keyword-Argumente.
soo und wie bestimme ich jetzt, dass er ausließt, bis zu einem semikolon und dann das ganze in eine sql datenbank packt?
müsste ja dann weitergehen (wenn schon mit popy eine verbindung zu der sql datenbank hergestellt ist)

Code: Alles auswählen

Curse.ececute(
       "Insert into test
       (datum, zahl, zahl, bezeichnung)
        values
       ( ?, ?, ?, ?)"
)
Da fehlt noch das zweite Argument, also die Werte die für die Fragezeichen in die Datenbank geschrieben werden sollen.
muss ich die ausgelesenen sachen in variablen packen oder kann ich die irgendwie einfach so in values übergeben?
wiederholt sich die prozedur von alleine bis die ganze CSV ausgelesen ist?
Das geht mit `executemany()`. Die Methode erwartet als zweites Argument ein iterable mit mehreren Datensätzen. Und das ist so ein `csv.reader()` Rückgabewert.
ist das CSV modul von vorneherein in python bei der installation dabei?
Jup.

Kleines Beispiel:

CSV Datei:

Code: Alles auswählen

Methusalem;1000
Eric;23
Future Baby;-10
Datenbank anlegen (zum Testen habe ich mal 'ne Sqlite DB genommen):

Code: Alles auswählen

$ sqlite3 test.db
SQLite version 3.2.8
Enter ".help" for instructions
sqlite> create table persons (name char(50), age int);
Das Python-Programm:

Code: Alles auswählen

import csv
from pysqlite2 import dbapi2 as sqlite

in_file = open('test.csv', 'rb')
reader = csv.reader(in_file, delimiter=';')

connection = sqlite.connect('test.db')
cursor = connection.cursor()
cursor.executemany('INSERT INTO persons (name, age) VALUES (?, ?)', reader)
cursor.close()
connection.commit()
connection.close()

in_file.close()
Und das Ergebnis:

Code: Alles auswählen

sqlite> select * from persons;
Methusalem|1000
Eric|23
Future Baby|-10
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

So und die Fragezeichen kann ich einfach da einsetzen? sind das die Platzhalter oder wie?
ich hatte die Fragezeichen eigentlich gesetzt um zu zeigen, das ich keine Ahung hab welcher Platzhalter für die Werte da rein muss?

Weil die SQL-Syntax heist ja :
bei Insert into werden die Spalten der Datenbank eingegeben in folgender Reihenfolge

Spaltekundennummer, Spalte name

und zu dem Values Befehl ja dann die eingelesenen Daten, doch wie werden die übergeben?

Weil wenn ich einen manuellen values wert erstelle, muss ich ja eingeben

Values ( 453, 'Meier');


Wie übergibt python die Werte 453 und Meier aus der CSV ?
BlackJack

BoOnOdY hat geschrieben:So und die Fragezeichen kann ich einfach da einsetzen? sind das die Platzhalter oder wie?
Ja das sind Platzhalter.
Wie übergibt python die Werte 453 und Meier aus der CSV ?
Die `executemany()` Methode bekommt als zweites Argument den `reader`, der die ganzen Zeilen enthält, pro Zeile eine Liste mit den Werten. Und genau aus diesen Listen werden die Werte auf die Platzhalter in der SQL-Anweisung verteilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Code: Alles auswählen

import csv 
import psycopg2

in_file = open('02.08.2006.csv', 'rb') 
reader = csv.reader(in_file, delimiter=';') 

conn= connect ('dbname=GBC user=tim pw=1234) 
curs= conn.cursor() 
cursor = connection.cursor() 
cursor.executemany('INSERT INTO test (Datum, Uhrzeit, Eingangsport, Ausgangsport, Eingangsnummer, Ausgangsnummer, Dauer, Hinweis) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', reader) 
cursor.close() 
connection.commit() 
connection.close() 

in_file.close()
Hey, warum funzt das net? was hab ich noch nicht kapiert?

danke schon ma im Voraus und im Rückblick
Tim

PS: Wo muss die .csv liegen?
BlackJack

Du bekommst von Python eigentlich meistens ganz gute Hinweise durch die Ausgabe der Exception. Bitte gib die immer mit an, am besten einfach 1:1 ins Forum kopieren.

In diesem Fall dürfte es ein Syntax-Fehler sein, weil Du, wie man auch hier am Syntax-Highlighting erkennen kann, eine Zeichenkette nicht beendest.

Dann gibt's in dem Modul den Namen `connect` nicht, das gibt einen `NameError`. Der Name steckt im `psycopg2` Modul. Das heisst Du musst die Funktion über das Modul referenzieren `psycopg2.connect()` oder den Namen mit ``from psycopg2 import connect`` in das aktuelle Modul importieren.

Und Die Übergabe der Argumente bei `connect` ist falsch. Das habe ich aber schon einmal geschrieben. Da musst Du nicht eine Zeichenkette angeben, sondern die einzelnen Optionen als Keyword-Argumente. Beispielsweise so:

Code: Alles auswählen

connection = connect(dbname='GBC', user='tim', pw='1234')
Dateien werden relativ zum Arbeitsverzeichnis des Prozesses angesprochen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BlackJack hat geschrieben:

Code: Alles auswählen

connection = connect(dbname='GBC', user='tim', pw='1234')
Hi BlackJack!

*psycopg2* ist da eine Ausnahme. Das kann sowohl mit benannten Parametern oder mit einem Connection-String, wie ihn Tim verwendet, eine Verbindung aufbauen. Allerdings sollte er dabei auf die Anführungszeichen achten. ;-)

Code: Alles auswählen

>>> help(psycopg2.connect)
Help on built-in function connect in module psycopg2._psycopg:

connect(...)
    connect(dsn, ...) -- Create a new database connection.
    
    This function supports two different but equivalent sets of arguments.
    A single data source name or ``dsn`` string can be used to specify the
    connection parameters, as follows::
    
        psycopg2.connect("dbname=xxx user=xxx ...")
    
    If ``dsn`` is not provided it is possible to pass the parameters as
    keyword arguments; e.g.::
    
        psycopg2.connect(database='xxx', user='xxx', ...)
    
    The full list of available parameters is:
    
    - ``dbname`` -- database name (only in 'dsn')
    - ``database`` -- database name (only as keyword argument)
    - ``host`` -- host address (defaults to UNIX socket if not provided)
    - ``port`` -- port number (defaults to 5432 if not provided)
    - ``user`` -- user name used to authenticate
    - ``password`` -- password used to authenticate
    - ``sslmode`` -- SSL mode (see PostgreSQL documentation)
    
    If the ``connection_factory`` keyword argument is not provided this
    function always return an instance of the `connection` class.
    Else the given sub-class of `extensions.connection` will be used to
    instantiate the connection object.
    
    :return: New database connection
    :rtype: `extensions.connection`
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Code: Alles auswählen

import csv 
import psycopg2

in_file = open('02.08.2006.csv', 'rb') 
reader = csv.reader(in_file, delimiter=';') 

connection = psycopg2.connect ("dbname=GBC user=Import password=import") 
cursor = connection.cursor() 
cursor.executemany("INSERT INTO call (Datum, Uhrzeit, Eingangsport, Ausgangsport, Eingangsnummer, Ausgangsnummer, Dauer, Fehler) VALUES (?, ?, ?, ?, ?, ?, ?, ?), reader") 
cursor.close() 
connection.commit() 
connection.close() 

in_file.close()


der Fehler is, dass sich mein python aufhängt
und windows sagt "python hat ein problem festgestellt und musste beendet werden"
kann es sein das ich irgend nen falschen Befehl benutzt hab ? müssen die Fragezeichen noch durch was ersetzt werden?
ich habs genau so ausgeführt.

Gruß Tim :)
Ps: der SQL code

Code: Alles auswählen

CREATE TABLE "Call"
(
  "Datum" text NOT NULL,
  "Uhrzeit" text,
  "Eingangsport" int2,
  "Ausgangsport" int2,
  "Eingangsnummer" text,
  "Ausgangsnummer" text,
  "Dauer" int2,
  "Fehler" text
) 
WITHOUT OIDS;
ALTER TABLE "Call" OWNER TO "Tim";
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BoOnOdY hat geschrieben:kann es sein das ich irgend nen falschen Befehl benutzt hab ? müssen die Fragezeichen noch durch was ersetzt werden?
ich habs genau so ausgeführt.
[...]

Code: Alles auswählen

CREATE TABLE "Call"
(
  "Datum" text NOT NULL,
  "Uhrzeit" text,
  "Eingangsport" int2,
  "Ausgangsport" int2,
  "Eingangsnummer" text,
  "Ausgangsnummer" text,
  "Dauer" int2,
  "Fehler" text
) 
WITHOUT OIDS;
ALTER TABLE "Call" OWNER TO "Tim";
Hi Tim!

- Erstelle dir immer einen Primärschlüssel. (im Beispiel "id")
- int2 würde ich auf int4 erhöhen.
- text ??? --> varchar(maximale Feldgröße)
- Bei leeren Feldern, statt einem leeren String None übergeben (= vielleicht besser)
- Bei *psycopg2* ist ``%s`` als Platzhalter bei ``execute()`` und ``executemany()`` einzusetzen

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

#CREATE TABLE call (
#   id serial PRIMARY KEY,
#   datum date, 
#   uhrzeit time, 
#   eingangsport int4, 
#   ausgangsport int4, 
#   eingangsnummer varchar(50), 
#   ausgangsnummer varchar(50), 
#   dauer int4, 
#   fehler varchar(50)
#) WITHOUT OIDS;

import psycopg2
import csv
import datetime


# Datenbank-Connection und -Cursor erstellen
conn = psycopg2.connect(user = "Import", password = "import", database = "GBC")
cur = conn.cursor()

# CSV-Datei öffnen
f = file("02.08.2006.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 = []
    # Datum
    d, m, y = ( int(val) for val in row[0].split(".") )
    data.append(datetime.date(y, m, d))
    # Uhrzeit
    H, M, S, ms = ( int(val) for val in row[1].split(":") )
    data.append(datetime.time(H, M, S, ms))
    # Eingangsport und Ausgangsport, Eingangsnummer und Ausgangsnummer
    data += [int(row[2]), int(row[3]), row[4] or None, row[5] or None]
    # Dauer
    try:
        data.append(int(row[6]))
    except ValueError:
        data.append(None)
    # Fehler
    data.append(row[7].strip())
    
    #
    # Daten in DB schreiben
    #
    sql = """
    INSERT INTO call (
        datum, 
        uhrzeit, 
        eingangsport, 
        ausgangsport, 
        eingangsnummer, 
        ausgangsnummer, 
        dauer, 
        fehler
    ) VALUES (
        %s, %s, %s, %s, %s, %s, %s, %s
    )
    """
    cur.execute(sql, data)
    
# Commit
conn.commit()

# CSV-Datei schließen
f.close()

# Anzeigen
sql = "SELECT * FROM daten"
cur.execute(sql)
print cur.fetchall()

# Datenbankverbindung trennen
cur.close()
conn.close()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Sehr cool :) tausend Dank

kann ich dem auch irgendwie sagen, dass wenn die Zeile schon existiert, soll er sie nicht noch mal reinkopieren?
wie msste ich das anfangen?
irgend eine if abfrage?

wie sieht so was in python aus? und kann man das einfach so machen?


ich probier ma ein bisschen rum, kann sein das ich vieleicht noch ein paar Fragen hab.

Gruß Tim :D


PS: da drauf muss jetzt noch net geantwortet werden, ich probier erst ma ein bisschen rum, und dann stell ich noch ma ne konkrete Frage, Danke schon ma :)
Zuletzt geändert von BoOnOdY am Donnerstag 3. August 2006, 16:11, insgesamt 1-mal geändert.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

"sql" bei google einzutippen bringt wunder!
da kannst du alles herausfinden...
ich würde die art von if-abfragen der datenbank überlassen, die hat schließlich die funktionen.
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BoOnOdY hat geschrieben:wenn die Zeile schon existiert, soll er sie nicht noch mal reinkopieren?
Hi Tim!

Das Einfachste für dich ist, wenn du die wichtigen Tabellenfelder mit einer Unique-Constraint zusammenfasst und so einstellst, dass diese unbedingt mit einem Wert belegt werden müssen. Dann schlägt PostgreSQL Alarm wenn du versuchst eine Zeile hinzuzufügen die es bereits gibt. Diesen Fehler kannst du dann abfangen und darauf reagieren.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

# CREATE TABLE call (
#  id serial NOT NULL,
#  datum date NOT NULL,
#  uhrzeit time NOT NULL,
#  eingangsport int4 NOT NULL,
#  ausgangsport int4 NOT NULL,
#  eingangsnummer varchar(50),
#  ausgangsnummer varchar(50),
#  dauer int4,
#  fehler varchar(50),
#  CONSTRAINT pk_call PRIMARY KEY (id),
#  CONSTRAINT c_call_unique UNIQUE (datum, uhrzeit, eingangsport, ausgangsport)
#) WITHOUT OIDS;


import psycopg2
import csv
import datetime


# Datenbank-Connection und -Cursor erstellen
conn = psycopg2.connect(user = "zopetest", password = "zopetest", database = "zopetest")
cur = conn.cursor()

# Datei öffnen
f = file("daten.csv", "r")

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

for row in ( row for row in csvdata if row ):
    #
    # Daten vorbereiten
    #
    data = []
    # Datum
    d, m, y = ( int(val) for val in row[0].split(".") )
    data.append(datetime.date(y, m, d))
    # Uhrzeit
    H, M, S, ms = ( int(val) for val in row[1].split(":") )
    data.append(datetime.time(H, M, S, ms))
    # Eingangsport und Ausgangsport, Eingangsnummer und Ausgangsnummer
    data += [int(row[2]), int(row[3]), row[4] or None, row[5] or None]
    # Dauer
    try:
        data.append(int(row[6]))
    except ValueError:
        data.append(None)
    # Fehler
    data.append(row[7].strip())
    
    #
    # Daten in DB schreiben
    #
    sql = """
    INSERT INTO call (
        datum, 
        uhrzeit, 
        eingangsport, 
        ausgangsport, 
        eingangsnummer, 
        ausgangsnummer, 
        dauer, 
        fehler
    ) VALUES (
        %s, %s, %s, %s, %s, %s, %s, %s
    );
    """
    try:
        cur.execute(sql, data)
    except psycopg2.IntegrityError, errdata:
        if "c_call_unique" in str(errdata):
            conn.rollback()
        else:
            raise
    # Commit nach jedem "execute", da bei Fehler ein "Rollback" durchgeführt wird.
    conn.commit()

# CSV-Datei schließen
f.close()

# Anzeigen
sql = "SELECT * FROM call"
cur.execute(sql)
print cur.fetchall()

# Datenbankverbindung trennen
cur.close()
conn.close()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten