34

我在 PostgreSQL 中找不到任何关于 JSON 模式验证的信息,有没有办法在 PostgreSQL JSON 数据类型上实现 JSON 模式验证?

4

3 回答 3

26

还有另一个实现 json 验证的PostgreSQL 扩展。用法与“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 编写的。

免责声明,我已经写了这个扩展。

于 2017-08-15T18:49:48.557 回答
22

有一个在 PL/PgSQL 中实现 JSON Schema 验证的PostgreSQL 扩展。

它是这样使用的(取自项目 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).
于 2016-12-14T09:18:17.203 回答
2

您需要的是将 JSON Schema 约束转换为 PostgreSQL 约束的东西,例如:

{
    "properties": {
        "age": {"minimum": 21}
    },
    "required": ["age"]
}

至:

SELECT FROM ...
WHERE (elem->>'age' >= 21)

我不知道任何现有的工具。我知道MySQL有类似的东西,可能对编写你自己的代码有用,但对于在 PostgreSQL 中使用 JSON 类型没有任何帮助。

于 2014-03-06T17:51:59.460 回答