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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage