【问题标题】:JSON Schema validation in PostgreSQL?PostgreSQL 中的 JSON 模式验证?
【发布时间】:2014-04-09 07:51:25
【问题描述】:

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

【问题讨论】:

    标签: json postgresql jsonschema postgresql-json


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      这样使用(取自项目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).
      

      【讨论】:

      • 您知道是否有针对此验证的性能负载测试吗?
      • 我不知道。代码很短(259 行),是一个非常直接的 PL/PgSQL,它被解释了。您应该使用自己的架构来衡量它。
      【解决方案3】:

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

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

      到:

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

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

      【讨论】:

      • 我认为此时没有可用的模式验证,你知道我们是否有机会使用 V8 引擎进行验证,例如在某些 OnUpdate/OnInsert 操作中?
      • 哦!抱歉,我误解了,并认为您是在询问使用 JSON Schema 进行查询,而不是验证。是的,作为钩子进行验证,甚至在提交之前在代码中进行验证似乎是合理的。
      • 查看此资源。可能会有所帮助。 blog.endpoint.com/2013/06/…
      猜你喜欢
      • 2016-10-05
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多