Проверка JSON-схемы в PostgreSQL?

Я не могу найти какую-либо информацию о проверке схемы JSON в PostgreSQL, есть ли способ реализовать проверку JSON Schema на типе данных PostgreSQL JSON?

Ответы

Ответ 1

Существует расширение PostgreSQL, которое реализует проверку схемы JSON в PL/PgSQL.

Используется так (взято из файла 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).

Ответ 2

Вам нужно что-то перевести ограничения схемы JSON в PostgreSQL, например:

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

в

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

Я не знаю никаких существующих инструментов. Я знаю что-то подобное для MySQL, которое может быть полезно для написания вашего собственного, но ничего не для использования типа JSON в PostgreSQL.

Ответ 3

Существует еще один расширение PostgreSQL, которое реализует проверку json. Использование почти такое же, как "Postgres-JSON-схема"

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).

Я провел несколько тестов, проверяющих твиты, и это в 20 раз быстрее, чем "Postgres-JSON-схема", главным образом потому, что он написан на C вместо SQL.

Отказ от ответственности, я написал это расширение.