psycopg2 Zuordnung von Python: "Liste der Befehle" zu Postgres: "Array vom zusammengesetzten Typ" für eine INSERT-Anweisung
Postgres-Version: 9.1.x.
Angenommen, ich habe das folgende Schema:
DROP TABLE IF EXISTS posts CASCADE;
DROP TYPE IF EXISTS quotes CASCADE;
CREATE TYPE quotes AS
(
text CHARACTER VARYING,
is_direct CHARACTER VARYING
);
CREATE TABLE posts
(
body CHARACTER VARYING,
q quotes[]
);
Und ich möchte die folgende Einfügung ausführen, die in SQL gezeigt wird, aber von Python Psycopg2.
insert into posts(body,q) VALUES('ninjas rock',ARRAY[ ROW('I AGREE',True)::quotes, ROW('I DISAGREE',FALSE)::quotes ]);
Was ist die Syntax, um dies zu erreichen (ohne Schleifen und dergleichen). Ich bin sicher, dass es seit dem möglich istDokumentation sagt "Geändert in Version 2.4.3: Unterstützung für Array von Composite-Typen hinzugefügt". Die Dokumentation zeigt nur Beispiele vonSELECT
Aussagen.
Hinweis: In meinem Client-Code befindet sich eine Liste von Dikten, die konzeptionell dem obigen Pseudoschema entsprechen.
bearbeiten:
Hmm ich muss das aus der Dokumentation verpasst haben:"Die Anpassung von Python-Tupeln an zusammengesetzte Typen erfolgt stattdessen automatisch und erfordert keine Adapterregistrierung.". Nun, um den Array-Teil herauszufinden.
2 bearbeiten:
psycopg2's%s
Platzhalter sollte funktionieren, wenn der übergebene Datentyp istlist(tuple)
oderlist(dict)
. Muss ich testen: D
edit3: Ok, fast da, Befehle funktionieren in diesem Szenario nicht, Listen und Tupel funktionieren. Ich muss jedoch die Tupel-String-Darstellung in den zusammengesetzten Datensatztyp umwandeln.
Diese :
quote_1 = ("monkeys rock", "False")
quote_2 = ("donkeys rock", "True")
q_list = [ quote_1, quote_2]
print cur.mogrify("insert into posts VALUES(%s,%s)", ("animals are good", q_list))
Erstellt die folgende Zeichenfolge:
insert into posts VALUES('animals are good',ARRAY[('monkeys rock', 'false'), ('donkeys rock', 'true')])
Welches erzeugt den folgenden Fehler:
psycopg2.ProgrammingError: column "q" is of type quotes[] but expression is of type record[]