使用 Sqitch 迁移进行数据库播种
Database seeding with Sqitch migrations
我有一组创建表和函数等的 Sqitch 迁移。但是,我还需要使用我的应用程序所需的基本数据集来播种我的数据库。
但是,一些种子需要之前创建的种子的 ID。例如。我有一个创建 Post 的函数和一个评论的函数,在我创建 Post 之后,我需要创建引用 Post.[=15= 的 ID 的评论]
我的 post_create
函数如下所示:
BEGIN;
CREATE FUNCTION post_create(
_title TEXT,
_body TEXT
)
RETURNS SETOF post_type
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY (
WITH _created_post AS (
INSERT INTO "post" (
"title",
"body"
"created_at"
)
VALUES (
_title,
_body,
ROUND(EXTRACT(EPOCH FROM now()))
)
RETURNING
*
)
SELECT
*
FROM
_created_post
);
END;
$$;
COMMIT;
我的 comment_create
函数看起来很相似,像这样:
BEGIN;
CREATE FUNCTION comment_create(
_post_id INTEGER,
_body TEXT
)
RETURNS SETOF comment_type
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY (
WITH _created_comment AS (
INSERT INTO "comment" (
"post_id",
"body"
"created_at"
)
VALUES (
_post_id,
_body,
ROUND(EXTRACT(EPOCH FROM now()))
)
RETURNING
*
)
SELECT
*
FROM
_created_comment
);
END;
$$;
COMMIT;
我的播种迁移基本上是一个空白的 Sqitch 迁移:
-- Deploy my-app:seeds to pg
-- requires: post_create
-- requires: comment_create
BEGIN;
-- Create a post and capture the post Id
-- Create a comment with previously captured post Id
COMMIT;
但是,我无法弄清楚使它正常工作的语法。
如何让我的 Sqitch 迁移脚本调用函数并在调用其他函数时将结果用作输入?
使用匿名函数?:
https://www.postgresql.org/docs/12/sql-do.html
DO $$
DECLARE
post post_type;
BEGIN
--Edited to version that Luke created and used.
SELECT * FROM post_create(...) INTO post;
PERFORM comment_create(post.id, 'body text');
END$$;
我有一组创建表和函数等的 Sqitch 迁移。但是,我还需要使用我的应用程序所需的基本数据集来播种我的数据库。
但是,一些种子需要之前创建的种子的 ID。例如。我有一个创建 Post 的函数和一个评论的函数,在我创建 Post 之后,我需要创建引用 Post.[=15= 的 ID 的评论]
我的 post_create
函数如下所示:
BEGIN;
CREATE FUNCTION post_create(
_title TEXT,
_body TEXT
)
RETURNS SETOF post_type
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY (
WITH _created_post AS (
INSERT INTO "post" (
"title",
"body"
"created_at"
)
VALUES (
_title,
_body,
ROUND(EXTRACT(EPOCH FROM now()))
)
RETURNING
*
)
SELECT
*
FROM
_created_post
);
END;
$$;
COMMIT;
我的 comment_create
函数看起来很相似,像这样:
BEGIN;
CREATE FUNCTION comment_create(
_post_id INTEGER,
_body TEXT
)
RETURNS SETOF comment_type
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY (
WITH _created_comment AS (
INSERT INTO "comment" (
"post_id",
"body"
"created_at"
)
VALUES (
_post_id,
_body,
ROUND(EXTRACT(EPOCH FROM now()))
)
RETURNING
*
)
SELECT
*
FROM
_created_comment
);
END;
$$;
COMMIT;
我的播种迁移基本上是一个空白的 Sqitch 迁移:
-- Deploy my-app:seeds to pg
-- requires: post_create
-- requires: comment_create
BEGIN;
-- Create a post and capture the post Id
-- Create a comment with previously captured post Id
COMMIT;
但是,我无法弄清楚使它正常工作的语法。
如何让我的 Sqitch 迁移脚本调用函数并在调用其他函数时将结果用作输入?
使用匿名函数?: https://www.postgresql.org/docs/12/sql-do.html
DO $$
DECLARE
post post_type;
BEGIN
--Edited to version that Luke created and used.
SELECT * FROM post_create(...) INTO post;
PERFORM comment_create(post.id, 'body text');
END$$;