mapowanie psycopg2 Python: „lista dyktatów” dla Postgres: „tablica typu złożonego” dla instrukcji INSERT

Wersja Postgres: 9.1.x.

Powiedz, że mam następujący schemat:

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

I chcę wykonać następującą wstawkę, pokazaną w SQL, ale z Pythona Psycopg2.

insert into posts(body,q) VALUES('ninjas rock',ARRAY[ ROW('I AGREE',True)::quotes, ROW('I DISAGREE',FALSE)::quotes ]);

Jaka jest składnia, aby to osiągnąć (bez pętli i tak dalej). Jestem pewien, że jest to możliwe od czasumówi dokumentacja „Zmieniono w wersji 2.4.3: dodano obsługę tablicy typów kompozytowych”. Dokumentacja pokazuje tylko przykładySELECT sprawozdania.

Uwaga: Mam listę dykt w moim kodzie klienta, która koncepcyjnie odwzorowuje powyższy schemat psuedo.

edytować:

Hmm, musiałem to przegapić z dokumentacji:„Adaptacja krotek Pythona do typów złożonych jest automatyczna i nie wymaga rejestracji adaptera”.. Teraz, aby obliczyć część tablicy.

edytuj 2:

psycopg2%s symbol zastępczy powinien działać, gdy przekazywany jest typ danychlist(tuple) lublist(dict). Musisz to przetestować: D

edytuj3: Ok prawie tam, dicts nie działają w tym scenariuszu, listy czy krotki robią. Jednak muszę rzutować reprezentację ciągów krotek na typ rekordu złożonego.

To:

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

Tworzy następujący ciąg:

insert into posts VALUES('animals are good',ARRAY[('monkeys rock', 'false'), ('donkeys rock', 'true')])

Który powoduje następujący błąd:

psycopg2.ProgrammingError: column "q" is of type quotes[] but expression is of type record[]

questionAnswers(1)

yourAnswerToTheQuestion