Вопрос по psycopg2, postgresql, orm, relational-database, python – Отображение psycopg2 Python: «список диктов» для Postgres: «массив составного типа» для оператора INSERT

3

Версия 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[]
Хороший вопрос, и спасибо за продолжение. В будущем будет лучше, если вы также опубликуете свою версию PostgreSQL, поскольку возможности Pg значительно различаются от версии к версии. Craig Ringer

Ваш Ответ

1   ответ
4

Просто приложите немного усилий, как насчет:

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::quotes[])", 
                  ("animals are good", q_list))
#
#                 added explicit cast to quotes[]->^^^^^^^^

Explanation:

Если вы запускаете:

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

прямо вpsql вы получите:

regress=# insert into posts 
regress-# VALUES('animals are good',ARRAY[
regress-#             ('monkeys rock', 'false'),
regress-#             ('donkeys rock', 'true')
regress-#  ]);
ERROR:  column "q" is of type quotes[] but expression is of type record[]
LINE 1: insert into posts VALUES('animals are good',ARRAY[('monkeys ...
                                                    ^
HINT:  You will need to rewrite or cast the expression.

Конечно же, говоря Pg, что ваш анонимный массив имеет типquotes[] делает трюк:

regress=# insert into posts 
regress-# VALUES('animals are good',ARRAY[
regress-#           ('monkeys rock', 'false'),
regress-#           ('donkeys rock', 'true')
regress-# ]::quotes[]);
INSERT 0 1

regress=# select * from posts;
       body       |                           q                            
------------------+--------------------------------------------------------
 animals are good | {"(\"monkeys rock\",false)","(\"donkeys rock\",true)"}
(1 row)
ааа::quotes просто вставляется дословно в запрос. Мой плохой = D Hassan Syed
Все подключено интегрировано: D теперь я могу иметь полнотекстовый поиск, работающий на одной таблице. Ааааа! Hassan Syed
Ого, ты спасатель жизни: D Я просматривал документацию для украшения%s, Я знал, что сделаю такое украшение возможным, если буду работать надPsycopg : D Я постараюсь отправить отзыв ребятам из psycopg2, чтобы обновить документацию. Hassan Syed
@HassanSyed Рад помочь. Вы были на 99% пути; иногда это просто занимает глаза другого человека, когда вы часами смотрите на проблему.

Похожие вопросы