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 模式验证?的主要内容,如果未能解决你的问题,请参考以下文章

可以在 PostgreSQL 端验证 JSON 吗?

根据 javascript 中的模式验证 json

Spring REST API 中的 Json 模式验证

chrome 打包应用程序中的 JSON 模式验证

使用 AJV 的 json 模式中的空值验证

RestAssured 中的无效 JSON Schema 异常,同时针对来自 swagger 的模式进行验证