【问题标题】:How to edit stored procedure in migration transparently?如何透明地编辑迁移中的存储过程?
【发布时间】:2016-05-18 20:30:05
【问题描述】:

我在 Laravel 项目中有一个迁移,它在数据库中创建了一个存储过程。我第一次创建此迁移时看起来不错。

但如果我想更改现有的存储过程,我必须创建一个迁移,其中包含新版本的过程代码。

它有效,但它不允许在git 中制作和查看清晰的diff

这是一个迁移示例:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

class GenerateReport extends Migration
{
    public function up()
    {
        DB::statement(<<<SQL
CREATE OR REPLACE FUNCTION myfunc() RETURNS void AS
\$func\$
BEGIN
  COPY (SELECT 1) TO '/tmp/myfile.tmp' BINARY;
END
\$func\$ LANGUAGE plpgsql;
SQL
        );
    }

    public function down()
    {
        DB::statement("DROP FUNCTION myfunc()");
    }
}

我的问题 - 有没有办法处理迁移并能够清楚地看到 git 中每一行迁移的每一个变化?

  • 我不想手动运行diff 工具来查看多个文件的更改。
  • 我可能只是使用旧迁移编辑现有文件并手动删除migration 表中的行。但这是一个 hack,我可能会忘记在生产中这样做。

【问题讨论】:

    标签: git laravel migration


    【解决方案1】:

    我看到的最简单的解决方案是 - 为存储过程创建一个特定的迁移文件,文件名中没有任何日期以避免混淆(例如,migrations/add_stored_procedures.php)。

    只要需要修改存储过程 - 编辑现有文件,以便 Git 按您的意愿正确显示修改。

    每次执行迁移时强制执行此特定迁移。两种可能:

    1. 扩展并替换 Laravel 的 Migrator 类以允许未记录的迁移。这将是我的首选,Laravel 非常灵活,可以轻松交换实现。

    2. 在您的迁移中,修改存储过程后,运行原始数据库查询,在迁移表中将此迁移标记为“新鲜”,以使 Laravel 相信它从未运行过。这个选项肯定更容易。

    【讨论】:

    • 感谢您的想法。 “允许未记录的迁移” - 你是什么意思?
    • 通常每次迁移在执行后都会被“记录”——它在一个特殊的 MySQL 表中被标记为成功执行。你可以在 Laravel 的 Migrator.php 中看到这一行: $this->repository->log($file, $batch);就是这样 - 如果我们避免对特定迁移执行此操作(您的存储过程迁移) - 目标将实现:)
    【解决方案2】:

    基于@Denis Mysenko 的answer

    为每次迁移创建一个包含 SQL 查询的文件,例如 database/my_procedure.sql

    更改此文件后,创建一个新的简约迁移,如下所示:

    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Support\Facades\DB;
    
    class GenerateReport extends Migration
    {
        public function up()
        {
            $filename = base_path() . '/database/database/my_procedure.sql';
            DB::statement(file_get_contents($filename));
        }
    
        public function down()
        {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-11
      • 2012-04-09
      • 1970-01-01
      • 2016-05-12
      • 2021-01-09
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      相关资源
      最近更新 更多