【发布时间】:2014-04-04 00:08:52
【问题描述】:
我正在努力将 JSON 对象存储到 Postgresql 数组中。我做了这样的事情 --
CREATE TABLE rock_band
(
name text,
members VARCHAR(200) []
);
INSERT INTO rock_band VALUES ('Linkin Park','{"Name":"Chester" , "age" : "38"}');
ERROR: malformed array literal:
关于我们如何将 json 存储到 Postgresql 数组然后将更多 json 对象附加到同一个数组的任何指导/指针。
如果我们可以在 Postgresql Array 中存储一个 JSON 对象,那么我们可以存储一个 HSTORE 值。
--- 更新 ---
好的,在 heapanalytics 的一个人的帮助下,我能够将值插入为 JSON 对象数组
CREATE TABLE rock_band (
name TEXT,
members JSON[] <<--- This is changed now as compared to last one
);
INSERT INTO rock_band VALUES ('The Who', '{}');
要追加到我所做的数组:
UPDATE rock_band SET members = array_append(members, '{"name":"Roger Daltry", "age":61}') WHERE name = 'The Who';
然后我得到这样的东西--
select * from rock_band;
name | members
---------+----------------------------------------------------------------------------------
The Who | {"{\"name\":\"Roger Daltry\", \"age\":61}","{\"name\":\"Chester\", \"age\":38}"}
(1 row)
但现在的问题是我如何查询它,比如 --
test=# select members from rock_band where 'Chester' = ANY(members->'name');
ERROR: operator does not exist: json[] -> unknown
LINE 1: ...mbers from rock_band where 'Chester' = ANY(members->'name');
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
有什么建议吗?
【问题讨论】:
-
您正在尝试将
members的值设置为字符串'{"Name":"Chester" , "age" : "38"}'。就 Postgres 而言,这里没有 JSON,只有一个字符串。INSERT INTO rock_band VALUES ('foo', 'bar')会出现同样的错误。请参阅 this documentation 了解如何编写数组字面量。 -
查询和使用这将毫无乐趣可言。我强烈建议规范化数据。仅仅因为 PostgreSQL 支持数组、json 等,并不意味着您应该将它们作为您的首选。
标签: arrays json postgresql