如何透明地编辑迁移中的存储过程?

时间:2016-05-18 20:30:05

标签: git laravel migration

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

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

虽然有效,但它不允许在diff中制作并查看git

以下是迁移示例:

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表中的行。但它是一个黑客,我可能忘记在生产中这样做。

2 个答案:

答案 0 :(得分:1)

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

每当需要修改存储过程时 - 编辑该现有文件,以便Git根据需要正确显示修改。

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

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

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

答案 1 :(得分:1)

基于@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()
    {
    }
}