psycopg2 将 Python:“字典列表”映射到 Postgres:INSERT 语句的“复合类型数组”

2023-12-12

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

稍微延长你的努力,怎么样:

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

解释:

如果你运行:

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

psycopg2 将 Python:“字典列表”映射到 Postgres:INSERT 语句的“复合类型数组” 的相关文章

随机推荐

  • ClickOnce 不遵守本地主机的安装文件夹

    我正在测试 ClickOnce 应用程序部署 我已经在我的机器上设置了一个虚拟目录 运行 IIS 我已指定http localhost SampleApplication作为 Visual Studio 的 发布 选项卡中的安装文件夹 UR
  • 在 AngularJS 中处理转换后的数据

    我有一个时间戳列表 我可以用 AngularJS 列出它们 不过我想将其列为日期字符串 这些日期字符串应该是可编辑的 完成后我也希望更新相关的时间戳 我的第一个问题是 AngularJS 以不同格式 过滤器 呈现项目并仍然具有双向数据绑定的
  • VIM 浏览器插件对文件执行命令

    我正在尝试 NERDtree 它非常酷 但我想做的是在所选文件上执行特殊命令或脚本 例如 我想突出显示树中的一个图像文件 按某个键并在原始文件中插入适当的 XHTML 标签 我有一个小脚本来进行格式化 我只需要在文件上运行它 或者在选择模块
  • Qt 事件和信号/槽

    在Qt世界中 事件和信号 槽有什么区别 一个会取代另一个吗 事件是信号 槽的抽象吗 在 Qt 中 信号和事件都是观察者模式 它们用于不同的情况 因为它们有不同的优点和缺点 首先 让我们准确定义 Qt 事件 的含义 Qt 类中的虚函数 如果您
  • Flutter FormatException:意外的字符(在字符 1 处)

    在 flutter 中 我使用一个 php 文件 该文件从数据库查询返回 json 响应 但是当我尝试解码 json 时 我收到此错误 E flutter 8294 ERROR flutter lib ui ui dart state cc
  • Jquery选择图像

    首先 我是 Jquery 的新手 我有这样的图像 我想要的是 当用户单击图像时 它会使图像带有边框 用户可以选择多个图像 选择时所有内容都必须带有边框 单击按钮后 我将获得图像 ID tr img src urlofimage tr gt
  • 比较两个文件在 python 中报告的差异

    我有 2 个名为 hosts 的文件 位于不同的目录中 我想使用 python 比较它们 看看它们是否相同 如果它们不相同 我想在屏幕上打印差异 到目前为止我已经尝试过这个 hosts0 open dst1 hosts r hosts1 o
  • Mapbox - 来自 GeoJson 属性的自定义标记图标

    我正在从一组 GeoJson 对象渲染标记 我想使用自定义图标作为标记 但无法确定正确的语法 下面是我用来渲染 geojson 的部分代码 asGeoJson gt type Feature properties title get lis
  • 快速通过segue传递数组

    我已经努力几天了 从我的数组中传递一个数组SecondViewController to my FirstViewController使用斯威夫特 从我的研究中我发现segue with prepareForSegue将是一个可行的选择 但
  • EXCEL VBA:如何使用 isString 或 isNumeric 验证值?

    下面是我的代码 Dim m As String n As Long n InputBox Enter sales amount If n lt 500 Or n gt 5000 Then ActiveCell Value n ActiveC
  • 操作列表内的数据框

    这可能是一个简单的问题 但我一直找不到答案 我想删除列表内数据帧的一列 x1 lt rnorm 100 0 1 x2 lt rnorm 100 0 1 x3 lt rnorm 100 0 1 x4 lt rnorm 100 0 1 df1
  • 使用 JavaScript/jQuery 捕获输入框内容的所有更改

    我有一个带有输入框的页面 以及一个处理该输入框的值并生成一段文本的函数 我希望该文本始终与输入框的内容相关 因此我使用 jQuery 附加了几个事件处理程序以捕获任何更改 input bind keyup cut paste functio
  • “Object.freeze(Object.prototype)”仅仅是用符号扩展“Object.prototype”的危险吗?

    所以 从根本上来说 这个问题不是基于意见的 我认真客观地追寻这个问题 没有feeling大多产生于主流意见 为什么扩展本机对象是一种不好的做法 这个问题是相关但未回答的问题 如果使用 Symbol 属性扩展 Object prototype
  • 如何在Android中创建目录?

    一切都在问题之中 这是我的代码 private void createDirectory File currentDirectory File f null try f new File currentDirectory getCanoni
  • 即使参数是函数调用,C 也会使用短路求值吗?

    我知道逻辑运算符会进行短路检查 也就是说 如果有这样的语句A B C 那么如果A是假的 B and C不予评价 但这也适用于以下情况 B and C是函数调用吗 例如 这段代码中的 return 语句 bool areIdentical s
  • Internet Explorer 10 及更低版本的 React、WebPack 和 Babel 会产生 SCRIPT1002:语法错误

    我已经阅读了有关类似问题的多个线程并尝试了一些建议 但没有结果 我遵循了一些相关的教程React js and 网页包3 结果 应用程序在所有浏览器上运行良好 目前 除了IE 10及以下 错误指向bundle js 一旦我使用配置Nr 1
  • 公共活动中未定义的方法“销毁”

    用户可以在屏幕上发表评论 并由 PublicActivity 进行跟踪 comment create activity create owner current user recipient comment screen user 注释取决
  • OpenCV2.3 imwrite保存黑色图像

    我正在尝试使用 imwrite 将 JPEG 图像保存到磁盘上 似乎我丢失了一些东西 我总是得到 4KB 左右的黑色图像 我在这里做错了什么 我看到的图像看起来不错 但一旦进入磁盘 它就全黑了 std vector
  • Javascript 中带逗号和点的十进制数的区别

    我应该验证输入表单测试值是否 gt 0 我使用 jQuery 获取值并使用简单的 if 语句进行验证 像这样 var value this id val console log value is value if value gt 0 co
  • psycopg2 将 Python:“字典列表”映射到 Postgres:INSERT 语句的“复合类型数组”

    Postgres 版本 9 1 x 假设我有以下架构 DROP TABLE IF EXISTS posts CASCADE DROP TYPE IF EXISTS quotes CASCADE CREATE TYPE quotes AS t