PostgreSQL 中的 JSON 模式验证?
Posted
技术标签:
【中文标题】PostgreSQL 中的 JSON 模式验证?【英文标题】:JSON Schema validation in PostgreSQL? 【发布时间】:2014-04-09 07:51:25 【问题描述】:我在 PostgreSQL 中找不到任何关于 JSON 模式验证的信息,有没有办法在 PostgreSQL JSON 数据类型上实现 JSON 模式验证?
【问题讨论】:
【参考方案1】:还有另一个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 编写的。
免责声明,我已经写了这个扩展。
【讨论】:
【参考方案2】:有一个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).
【讨论】:
您知道是否有针对此验证的性能负载测试吗? 我不知道。代码很短(259 行),是一个非常直接的 PL/PgSQL,它被解释了。您应该使用自己的架构来衡量它。【参考方案3】:您需要的是将 JSON Schema 约束转换为 PostgreSQL 约束的东西,例如:
"properties":
"age": "minimum": 21
,
"required": ["age"]
到:
SELECT FROM ...
WHERE (elem->>'age' >= 21)
我不知道任何现有的工具。我知道mysql 有类似的东西,它可能对你自己编写有用,但对于在 PostgreSQL 中使用 JSON 类型没有任何作用。
【讨论】:
我认为此时没有可用的模式验证,你知道我们是否有机会使用 V8 引擎进行验证,例如在某些 OnUpdate/OnInsert 操作中? 哦!抱歉,我误解了,并认为您是在询问使用 JSON Schema 进行查询,而不是验证。是的,作为钩子进行验证,甚至在提交之前在代码中进行验证似乎是合理的。 查看此资源。可能会有所帮助。 blog.endpoint.com/2013/06/…以上是关于PostgreSQL 中的 JSON 模式验证?的主要内容,如果未能解决你的问题,请参考以下文章