首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何透明地编辑迁移存储过程?

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

Stack Overflow用户
提问于 2016-05-18 20:30:05
回答 2查看 516关注 0票数 1

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

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

它可以工作,但它不允许让diffgit中清晰地显示出来。

下面是一个迁移示例:

代码语言:javascript
复制
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表中的行。但这是一次黑客攻击,我可能会忘记在生产中这样做。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-19 06:48:12

基于此answer由@Denis。

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

更改此文件后,创建如下新的极简式迁移:

代码语言:javascript
复制
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()
    {
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-05-18 23:55:31

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

每当需要修改存储过程时--编辑现有文件,以便Git按照您的需要正确地显示修改。

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

  1. 扩展和替换Laravel的Migrator类,以允许未记录的迁移。这将是我首选的选择,Laravel非常灵活,并且允许轻松地交换实现。
  2. 在迁移过程中,在修改存储过程之后,运行一个原始DB查询,将迁移标记为迁移表中的“新鲜”,以使Laravel相信它从未运行过。这个选项肯定更容易。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37309541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档