【问题标题】:Database seeding with Sqitch migrations使用 Sqitch 迁移的数据库播种
【发布时间】:2020-05-22 08:45:21
【问题描述】:

我有一组创建表和函数等的 Sqitch 迁移。但是,我还需要使用我的应用程序所需的基本数据集为我的数据库播种。

但是,有些种子需要来自之前创建的种子的 ID。例如。我有一个创建帖子的函数和一个评论的函数,在我创建帖子之后,我需要创建引用帖子 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 迁移脚本调用函数并在调用其他函数时将结果用作输入?

【问题讨论】:

    标签: postgresql sqitch


    【解决方案1】:

    使用匿名函数?: 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$$;
    
    

    【讨论】:

    • 谢谢。不幸的是,我收到一个错误:ERROR: syntax error at or near "SELECT" LINE 5: post = SELECT post_create(.
    • 编辑回我原来的表格。
    • 我似乎更喜欢这样的语法:SELECT * FROM post_create(...) INTO post;。只是想知道为什么您的答案中的语法会引发错误...
    • 你在说这篇文章吗 = post_create('title', 'body text');版本或帖子 = select * from post_create('title', 'body text');版本?第二个版本会抛出错误,因为我忘记了在赋值时 plpgsql 会执行隐式选择 func_name。如果您看到第一个版本出现错误,错误消息是什么?
    • 已更改答案代码以包含您的更改,因此任何人都将获得工作示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2018-11-28
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多