web-dev-qa-db-ja.com

PostgreSQLでのJSONスキーマ検証?

PostgreSQLでJSONスキーマ検証に関する情報が見つかりません。PostgreSQLJSONデータ型にJSONスキーマ検証を実装する方法はありますか?

26
khorvat

PL/PgSQLでJSONスキーマ検証を実装する 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).
11
Mordae

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倍高速です。これは、主にSQLではなくCで記述されているためです。

免責事項、私はこの拡張機能を作成しました。

9

必要なのは、JSONスキーマ制約をPostgreSQL制約に変換するものです。例:

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

に:

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

私は既存のツールを知りません。 MySQL に似たものを知っています。これは、独自の記述には役立つかもしれませんが、PostgreSQLでJSON型を使用する場合には何もありません。

3
cloudfeet