如何使用 libpq 插入此自定义数据类型?

Posted

技术标签:

【中文标题】如何使用 libpq 插入此自定义数据类型?【英文标题】:How do I insert this custom data type with libpq? 【发布时间】:2014-08-07 21:46:33 【问题描述】:

我在使用 libpq 插入一些数据时遇到了一些困难。我有两种自定义数据类型:

create type size as (width real, height real);
create type rotated_rect as (angle real, center point, bounding_box box, size size)

我想将一条记录插入到一​​个有 rotate_rect 字段的表中,所以对于使用 libpq 的字段,我将字符串值放在一起:

paramv[3] = "(10.5,10.1,10.2,20,20,20,40,(5,5))";

但是,它给了我错误:类型点的无效输入语法:“10.1”

我也试过了:

paramv[3] = "(10.5,(10.1,10.2),20,20,20,40,(5,5))"; -> invalid input syntax for "(10.1"
paramv[3] = "(10.5,(10.1,10.2),(20,20,20,40),(5,5))"; -> as above

我使用的sql命令是:

res = PQexecParams(conn, "insert into test (r,b,s,rr) values ($1::real,$2::box,$3::size,$4::rotated_rect)", 4, NULL, paramv, NULL, NULL,0);

我该如何解决这个问题?

【问题讨论】:

您的错误信息不完整且具有误导性。实际的错误消息应该是ERROR: invalid input syntax for type point: "(10.1"。请始终提供逐字的错误消息。 @ErwinBrandstetter 它在哪里误导?这正是我所说的! 不是。再读一遍,请解决您的问题。此外,您添加的 INSERT 语句的值多于参数。 @ErwinBrandstetter 4 个值,4 个参数 是的,但是如何在 binary 模式下而不是 ascii 模式下做到这一点? 【参考方案1】:

这有效(在 Postgres 9.3 中测试):

SELECT '(10.5,"(10.1,10.2)","(20,20,20,40)","(5,5)")'::rotated_rect

返回:

'(10.5,"(10.1,10.2)","(20,40),(20,20)","(5,5)")'

注意box 的不同语法。试试这个表格。

【讨论】:

我正在插入,没有选择,不,paramv[3] = "(10.5,\"(10.1,10.2)\",\"(20,20,20,40)\",\"(5,5)\")" 不起作用,给出错误:格式错误的记录文字“(20,20,20,40)”详细信息:列太多 我工作,我在发布前在 Postgrs 9.3 中进行了测试。但请尝试 Postgres 返回的语法。 不适用于 libpq:paramv[3] = "(10.5,\"(10.1,10.2),\"(20,21),(22,40)\",\"(5,5)\")"; 给出错误:“格式错误的记录文字:“(20,21),(22,40)”详细信息:右括号后的垃圾【参考方案2】:

让我感到惊讶的是,需要在表示自定义复合数据类型字段的值周围使用转义的双引号和括号,该字段需要创建多个值,因此:

paramv[0] = "(10.5,\"(10.1,10.2)\",\"(20,20,20,40)\",\"(5,5)\")";

由于此字符串用作参数,因此不需要通常包裹外括号的单引号。

在非参数化查询中,它会像这样使用单引号实现:

res = PQexec(conn, "insert into test (rr) values ('(10.5,\"(10.1,10.2)\",\"(20,20,20,40)\",\"(5,5)\")')");

【讨论】:

以上是关于如何使用 libpq 插入此自定义数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android活动中创建此自定义弹出消息?

如何使用绑定解除此自定义模式?

如何以编程方式创建此自定义绑定?

您如何在 Java 中更新此自定义绘制?

如何通过 wasm-pack 将 Rust Wasm 应用程序与 libpq 链接?

如何使自定义视频播放器适用于多个视频?