我在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
表中的行。但它是一个黑客,我可能忘记在生产中这样做。答案 0 :(得分:1)
我看到的最简单的解决方案是 - 为存储过程创建一个特定的迁移文件,文件名中没有任何日期以避免混淆(例如,migrations / add_stored_procedures.php)。
每当需要修改存储过程时 - 编辑该现有文件,以便Git根据需要正确显示修改。
每次执行迁移时,强制执行此特定迁移。两种可能性:
扩展并替换Laravel的Migrator类,以允许未记录的迁移。这将是我的首选,Laravel非常灵活,可以轻松交换实现。
在迁移过程中,在修改存储过程后,运行原始数据库查询,在迁移表中将此迁移标记为“新鲜”,以使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()
{
}
}