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