解析jsonb失败自动插入表-触发函数

问题描述 投票:0回答:0

Postgresql 触发器函数抛出异常(failed jsonb parsing)

我该如何解决?

第一桌

CREATE TABLE document_templates (
                           id SERIAL PRIMARY KEY,
                           name VARCHAR(255) NOT NULL,
                           created_at TIMESTAMP NOT NULL,
                           version INT NOT NULL,
                           fields JSONB NOT NULL
);

相关表格

CREATE TABLE document_fields (
                                 id SERIAL PRIMARY KEY,
                                 document_template_id INTEGER NOT NULL REFERENCES document_templates(id),
                                 field_name VARCHAR(255) NOT NULL,
                                 field_type VARCHAR(255) NOT NULL,
                                 placeholder TEXT,
                                 default_value TEXT
);

触发功能:

CREATE OR REPLACE FUNCTION fill_document_fields() RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO document_fields (document_template_id, field_name, field_type, placeholder, default_value)
    SELECT NEW.id, (f ->> 'name')::VARCHAR(255), (f ->> 'type')::VARCHAR(255), (f ->> 'placeholder')::TEXT, (f ->> 'default')::TEXT
    FROM jsonb_array_elements(NEW.fields) AS f;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER fill_document_fields_trigger
    AFTER INSERT ON document_templates
    FOR EACH ROW
EXECUTE PROCEDURE fill_document_fields();

错误!

[2023-03-29 17:19:40] [22023] ERROR: cannot extract elements from an object
[2023-03-29 17:19:40] Where: SQL statement "INSERT INTO document_fields (document_template_id, field_name, field_type, placeholder, default_value)
[2023-03-29 17:19:40] SELECT NEW.id, (f ->> 'name')::VARCHAR(255), (f ->> 'type')::VARCHAR(255), (f ->> 'placeholder')::TEXT, (f ->> 'default')::TEXT
[2023-03-29 17:19:40] FROM jsonb_array_elements(NEW.fields) AS f"
[2023-03-29 17:19:40] PL/pgSQL function fill_document_fields() line 3 at SQL statement

我插入了这个数据:

INSERT INTO document_templates (name, created_at, version, fields)
VALUES ('Example Document', NOW(), 1, '{"fields": [{"name": "Field 1", "type": "text", "placeholder": "Enter text here", "default": ""}, {"name": "Field 2", "type": "number", "placeholder": "Enter number here", "default": 0}]}'::JSONB);

和预期:

解析 jsonb 列值并自动将解析后的数据插入 document_fields 表

postgresql plpgsql
© www.soinside.com 2019 - 2024. All rights reserved.