【发布时间】:2014-04-09 07:51:25
【问题描述】:
我在 PostgreSQL 中找不到任何关于 JSON 模式验证的信息,有没有办法在 PostgreSQL JSON 数据类型上实现 JSON 模式验证?
【问题讨论】:
标签: json postgresql jsonschema postgresql-json
我在 PostgreSQL 中找不到任何关于 JSON 模式验证的信息,有没有办法在 PostgreSQL JSON 数据类型上实现 JSON 模式验证?
【问题讨论】:
标签: json postgresql jsonschema postgresql-json
还有另一个PostgreSQL extension 实现了 json 验证。用法和“Postgres-JSON-schema”差不多
CREATE TABLE example (id serial PRIMARY KEY, data jsonb);
-- do is_jsonb_valid instead of validate_json_schema
ALTER TABLE example ADD CONSTRAINT data_is_valid CHECK (is_jsonb_valid('{"type": "object"}', data));
INSERT INTO example (data) VALUES ('{}');
-- INSERT 0 1
INSERT INTO example (data) VALUES ('1');
-- ERROR: new row for relation "example" violates check constraint "data_is_valid"
-- DETAIL: Failing row contains (2, 1).
我已经对推文进行了一些基准测试,它比“Postgres-JSON-schema”快 20 倍,主要是因为它是用 C 而不是 SQL 编写的。
免责声明,我已经写了这个扩展。
【讨论】:
有一个PostgreSQL extension 在 PL/PgSQL 中实现 JSON Schema 验证。
这样使用(取自项目README文件):
CREATE TABLE example (id serial PRIMARY KEY, data jsonb);
ALTER TABLE example ADD CONSTRAINT data_is_valid CHECK (validate_json_schema('{"type": "object"}', data));
INSERT INTO example (data) VALUES ('{}');
-- INSERT 0 1
INSERT INTO example (data) VALUES ('1');
-- ERROR: new row for relation "example" violates check constraint "data_is_valid"
-- DETAIL: Failing row contains (2, 1).
【讨论】:
您需要的是将 JSON Schema 约束转换为 PostgreSQL 约束的东西,例如:
{
"properties": {
"age": {"minimum": 21}
},
"required": ["age"]
}
到:
SELECT FROM ...
WHERE (elem->>'age' >= 21)
我不知道任何现有的工具。我知道MySQL 有类似的东西,它可能对你自己编写有用,但对于在 PostgreSQL 中使用 JSON 类型没有任何作用。
【讨论】: