Отображение psycopg2 Python: «список диктов» для Postgres: «массив составного типа» для оператора INSERT
Версия Postgres: 9.1.x.
Скажем, у меня есть следующая схема:
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[]
);
И я хочу выполнить следующую вставку, показанную в SQL, но из Python Psycopg2.
insert into posts(body,q) VALUES('ninjas rock',ARRAY[ ROW('I AGREE',True)::quotes, ROW('I DISAGREE',FALSE)::quotes ]);
Каков синтаксис для достижения этого (без циклов и тому подобное). Я уверен, что это возможно, так какдокументация говорит "Changed in version 2.4.3: added support for array of composite types", В документации приведены только примерыSELECT
заявления.
Примечание: в моем клиентском коде есть список диктовок, которые концептуально соответствуют приведенной выше схеме psuedo.
edit:
Хм, должно быть, я пропустил это из документации:"Adaptation from Python tuples to composite types is automatic instead and requires no adapter registration.", Теперь, чтобы выяснить часть массива.
edit 2:
psycopg2 & APOS; s%s
заполнитель должен работать, когда переданный тип данныхlist(tuple)
или жеlist(dict)
, Должен проверить это: D
edit3: Хорошо, почти там, в этом сценарии не работают dicts, списки работают, а кортежи работают. Однако мне нужно привести представление строки кортежа в тип составной записи.
Это :
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))
Создает следующую строку:
insert into posts VALUES('animals are good',ARRAY[('monkeys rock', 'false'), ('donkeys rock', 'true')])
Который выдает следующую ошибку:
psycopg2.ProgrammingError: column "q" is of type quotes[] but expression is of type record[]