Postgresql mit psycopg2 - Fehlerbehandlung in SQL

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
PNS-Richi
User
Beiträge: 68
Registriert: Donnerstag 17. Januar 2008, 01:48

Freitag 21. August 2009, 13:15

Hallo,

gibt es ne möglichkeit psycopg2 mit zu teilen das es Fehler in SQL Anweisungen ignorieren soll?

Code: Alles auswählen

...
		sql = """DROP TABLE cat;
DROP TABLE blacklist;
DROP TABLE valid_time;
DROP TABLE whitelist_stat;"""

		self.c.execute(sql)
...
Wenn nun z.b. die Tabelle "cat" nicht vorhanden ist bricht er ab. Es geht jetzt allgemein um SQL Befehle. Egal ob nun in Zeile 354 ein Fehler aufgetretten ist, er soll einfach mit dem nächsten weiter machen. Ich hab nur ON_ERROR_ABORT gefunden, nur funktioniert dies nicht.

Schon mal danke für eure Hilfe...

lg Richi
lunar

Freitag 21. August 2009, 13:27

Fange die auftretende Ausnahme ab und verwirf sie:

Code: Alles auswählen

try:
    some_function_that_might_fail()
except SomeError:
    pass
Ein Kommentar, warum die Ausnahme verworfen werden kann, sollte allerdings noch dabei stehen.
PNS-Richi
User
Beiträge: 68
Registriert: Donnerstag 17. Januar 2008, 01:48

Freitag 21. August 2009, 14:39

Hallo,

die Python Fehlerbehandlung ist mir schon klar, nur ich hätte das gerne über Postgresql gelöst. In anderen Datenbanken ist es ja auch möglich SQL Fehler zu ignorieren.

lg Richi
lunar

Freitag 21. August 2009, 14:54

Entschuldige, dann habe ich Dich falsch verstanden :oops:

Eine allgemeine Möglichkeit zum Unterdrücken von SQL-Fehlern in Postgre kenne ich nicht. Bei "DROP TABLE" kannst Du allerdings "DROP TABLE IF EXISTS foobar" verwenden, um zumindest Fehler bei nicht vorhandenen Tabellen zu vermeiden.
PNS-Richi
User
Beiträge: 68
Registriert: Donnerstag 17. Januar 2008, 01:48

Freitag 21. August 2009, 15:39

Kommunikationsproblem :P

Nur leider brauch ichs bei mehr als nur bei "DROP ...".
Bei ein paar Millionen Einträgen ist es leichter Fehler zu überspringen, als zu überprüfen ob der Eintrag vorhanden ist.

Überhaupt bei einer Transaktion die z.b. auf einmal 1 Millionen Einträge eintragen soll ist es übel, wenn er mittendrinnen abbricht, weil irgendwas schon vorhanden ist.

Nun muss ich wohl vor jedem Eintrag überprüfen ob der Eintrag vorhanden ist, oder nicht.

Danke für deine bemühung mir zu helfen :-)

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

Freitag 21. August 2009, 20:34

PNS-Richi hat geschrieben:

Code: Alles auswählen

...
		sql = """DROP TABLE cat;
DROP TABLE blacklist;
DROP TABLE valid_time;
DROP TABLE whitelist_stat;"""

		self.c.execute(sql)...
Hallo Richi!

Nimm für so etwas nicht psycopg2, sondern bemühe das Kommandozeilenprogramm "psql" damit.
Wenn du es von Python aus aufrufen möchtest, dann kannst du "subprocess" dafür verwenden. Ich mache das auch so, wenn ich von Python aus eine Datenbank erstelle. Geringster Programmieraufwand -- sauberes Ergebnis!

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten