首页 > 解决方案 > 在 Postgres 过程中,创建文章和标签,然后返回创建的文章和标签

问题描述

我有一个用于存储文章和标签的数据库。新文章会自动创建标签,以便更轻松地处理它们。标签的最大数量被后端限制为 5。下面是表格的样子:

CREATE TABLE tag(
    name text PRIMARY KEY,
    created timestamp NOT NULL DEFAULT NOW()
);


CREATE TABLE article(
    id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
    name text,
    description text,
    author text references profile(name)
);

CREATE TABLE tag_article(
    tag text REFERENCES tag(name),
    article uuid REFERENCES article(id),
    UNIQUE (tag, article)
);

我创建了一个存储过程来创建文章,创建所有标签(除非它们存在),然后使用 tag_article 表连接它们:

create or replace procedure create_article(
    author text,
    name text,
    description text,
    tags text[]
)
language plpgsql    
as $$
begin

    INSERT INTO tag(name)
        SELECT v
            FROM unnest(tags) g(v)
        ON CONFLICT DO NOTHING;

    WITH article(id) AS(
        INSERT INTO article(author, name, description) 
            values(author,name,description) 
        RETURNING id
    )
    INSERT INTO tag_article(tag,article)
        SELECT g.v, article.id FROM
            unnest(tags) g(v), article;
    
    COMMIT;

END $$;

现在我需要一种方法来返回已创建的标签(如果有的话)和文章。我知道我可以使用返回 * 的标签,因为这只会给我创建的标签。但我还需要一种方法将其转发给过程的调用者。我也需要对文章做同样的事情。问题是,我已经返回了 id,所以我不知道如何才能用它返回整行。

那么我该如何修改这段代码以便

标签: postgresql

解决方案


推荐阅读