Проверка 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.
Отказ от ответственности, я написал это расширение.