postgresql - 在 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,所以我不知道如何才能用它返回整行。
那么我该如何修改这段代码以便
返回所有新创建的标签,包括创建日期和其他可能稍后添加到标签表或只是一个空集的信息
返回文章,也可能获得更多属性
解决方案
推荐阅读
- python - 为什么多处理的每个进程开销不断增加?
- laravel - 如何向未经授权的客户隐藏网站的 Vue.js 管理面板代码
- reactjs - 如何防止 react-router 搞乱 API 路由
- linux - do_trap() 会导致 page_fault 吗?
- c++ - 如何从文本文件中按降序对时间戳进行排序
- javascript - Ajax done 方法中的代码无法识别已加载的代码
- firebase - Flutter 对两个列表进行排序而不是一个
- python - pandas 如何找到具有最大值的组并删除该组
- typescript - 我想用 jest 写 vue-next ,但是遇到了一些问题
- c# - 使用 AmazonDynamoDBConfig 在 C# 中设置 RegionEndpoint 不起作用