【问题标题】:How to do JSON data validation with stored procedures in Postgresql如何在 Postgresql 中使用存储过程进行 JSON 数据验证
【发布时间】:2015-11-26 06:37:35
【问题描述】:

我在 postgress 数据库中有一个包含多个 JSON 类型列的 SQL 表。 我们想在插入数据之前对这些 JSON 列进行某种验证。

我们的目标是使用存储过程进行验证,该存储过程调用 noSQL 查询并在该 JSON 列上出现任何验证失败的情况下响应错误。

示例 -

假设我们在 User 表中有 5 到 6 个 JSON 列, JSON 列,例如 -

个人信息、帐户、所有者详细信息等,这些库具有复杂的 JSON,例如 JSON 数据列表或 JSON 中的 JSON。

现在我们要一一验证每一列,如果出现错误,返回唯一的错误代码。

【问题讨论】:

  • 我不会做你的工作。我在下面展示了如何继续验证 JSON 数据类型的列。

标签: json postgresql stored-procedures nosql


【解决方案1】:

当使用JSON 类型时,我们可以轻松地在 JSON 字段上定义约束。这是一个基本的演示:

CREATE FUNCTION is_valid_description(descr text) RETURNS BOOLEAN AS
    'SELECT length($1) > 10;'
LANGUAGE sql;

CREATE TABLE wizards (
    id SERIAL, 
    data JSON,
    CONSTRAINT validate_name CHECK ((data->>'name') IS NOT NULL AND length(data->>'name') > 0),
    CONSTRAINT validate_description CHECK ((data->>'description') IS NOT NULL AND (is_valid_description(data->>'description')))
);

我们检查数据列的两个 JSON 字段的约束。在一种情况下,我们使用用 SQL 编写的存储过程,但我们可以使用 PL/pgSQL 或 Perl 或 Python 编写更复杂的函数。

我们可能还想在其中一个字段上强制唯一性:

CREATE UNIQUE INDEX ui_wizards_name ON wizards((data->>'name'));

然后在插入或更新行时强制执行验证和唯一性约束。

-- violates check constraint "validate_description" 
INSERT INTO wizards(data) VALUES('{
    "name": "Kirikou", 
    "description": "A witch"
}');

-- passes
INSERT INTO wizards(data) VALUES('{
    "name": "Kirikou", 
    "description": "A witch of African descent"
}');

-- violates unique constraint "ui_wizards_name"
INSERT INTO wizards(data) VALUES('{
    "name": "Kirikou", 
    "description": "The same witch of African descent"
}');

http://sqlfiddle.com/#!15/23974/2 上玩的代码。

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多