Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
python:psycopg [2023/06/30 22:29] root [Copy] |
python:psycopg [2023/07/01 00:00] (aktuell) root [Copy] |
||
---|---|---|---|
Zeile 84: | Zeile 84: | ||
* schlägt das einfügen eines Datensatzes fehl wird alles rückabgewickelt | * schlägt das einfügen eines Datensatzes fehl wird alles rückabgewickelt | ||
* im Gegensatz zu insert into gibt es kein "on conflict" | * im Gegensatz zu insert into gibt es kein "on conflict" | ||
+ | * es dürfen also auch keine Doubletten in den Daten sein (die einen unique-Spalte betreffen würden) | ||
Zeile 92: | Zeile 93: | ||
copy.write_row(record) | copy.write_row(record) | ||
</ | </ | ||
+ | * record muss dabei ein iterateable sein, auch wenn nur eine Spalte eingefügt wird | ||
+ | * also zum Beispiel ein tuple | ||
+ | * liegt daran das es auch mehrere Spalten sein könnten -> (spalte1, spalte2 usw.) | ||
Daten aus einer Tabelle auslesen: | Daten aus einer Tabelle auslesen: | ||
Zeile 100: | Zeile 104: | ||
</ | </ | ||
+ | < | ||
+ | Traceback (most recent call last): | ||
+ | File " | ||
+ | copy.write_row(word) | ||
+ | File "/ | ||
+ | next(self.gen) | ||
+ | File " | ||
+ | raise ex.with_traceback(None) | ||
+ | psycopg.errors.BadCopyFileFormat: | ||
+ | CONTEXT: | ||
+ | </ | ||
+ | ^ Hier wurde vergessen das der Datensatz für die Spalte ein Iterateable sein muss. \\ | ||
+ | Daher wurde " | ||
+ | |||
+ | Fehlschlagender Code (Beispiel): | ||
+ | |||
+ | <sxh python> | ||
+ | names = [" | ||
+ | with cursor.copy(" | ||
+ | for name in names: | ||
+ | copy.write_row(name) | ||
+ | </ | ||
+ | |||
+ | * Daten werden aus einem iterateable names gelesen | ||
+ | * name ist eine Zeichenkette | ||
+ | * copy.write_row erwartet aber einen Datensatz | ||
+ | * ein Datensatz ist ein iterateable -> ein tuple, eine Liste usw. | ||
+ | * hier wurde ein String übergeben -> ein String ist auch ein iterateable -> also wird über den String iteriert | ||
+ | * da der String länger ist als die Menge der Spalten -> es gibt nur eine, kommt es zum Fehler | ||
+ | |||
+ | Hier sollte man auch aufpassen: | ||
+ | <sxh python> | ||
+ | names = [" | ||
+ | with cursor.copy(" | ||
+ | for name in names: | ||
+ | copy.write_row((name)) | ||
+ | </ | ||
+ | |||
+ | * name wird hier bei der Übergabe an copy.write_row scheinbar auf tuple gecastet | ||
+ | * allerdings nicht wirklich, es fehlt ein "," | ||
+ | * es muss (name,) heißen, sonst ist es ein String |