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 ]);
实现此目的的语法是什么(没有循环等)。我确信这是可能的,因为文件说 “2.4.3 版本中的更改:添加了对复合类型数组的支持”。该文档仅显示示例SELECT
声明。
注意:我的客户端代码中有一个字典列表,它们在概念上映射到上面的伪模式。
edit:
嗯,我一定是在文档中错过了这一点:“从 Python 元组到复合类型的适应是自动的,不需要适配器注册。”。现在弄清楚数组部分。
edit 2:
psycopg2 的%s
当传递的数据类型是时,占位符应该起作用list(tuple)
or list(dict)
。一定要测试一下:D
edit3:好吧,差不多就这样了,字典在这种情况下不起作用,列表可以,元组可以。但是,我需要将元组字符串表示形式转换为复合记录类型。
This :
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[]