Как задать валидатор для поля json/jsonb?

Добрый день, стоит задача валидировать данные в поле jsonb на уровне базы. Шаблон для данных:
{"en": "value", "ru": "значение"}
Вот что написал:
CREATE DOMAIN json_localized AS jsonb CHECK (VALUE->'ru' IS NOT NULL AND VALUE->'en' IS NOT NULL);

И это уже даже работает, но не получается добавить сюда проверку на лишние ключи, так же на пустые строки и на тип данных в ключах (должна быть строка). Т.е. такие варианты хочу исключить:
{"en": 6, "ru": "значение"}
{"en": "", "ru": "значение",}
{"en": "value", "ru": "значение", fr: "de valuje"}
Помогите модифицировать CHECK
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Конвертируешь в строку (jsonb -> text of json) и проверяешь регуляркой.
select jsonb_value,
       jsonb_value::text ~ '^{"en": "[^"]+", "ru": "[^"]+"}$' 
from test

https://dbfiddle.uk/?rdbms=postgres_12&fiddle=afc3...

Если поле не JSONB, а JSON, то дополнительно конвертируешь: https://dbfiddle.uk/?rdbms=postgres_12&fiddle=2bd6...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
проверку на лишние ключи, так же на пустые строки и на тип данных в ключах (должна быть строка).

Сделать шаг назад и задать вопрос "а зачем я здесь пытаюсь прикрутить JSON вместо более простых, компактных и быстрых plain полей"

jsonb_typeof для типа данных в JSON, для проверки "только такие ключи" сходу даже затрудняюсь что-то найти подходящее для check constraint.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы