SQLite 在 Migration 中 dropColumn 的一個小坑,哭死你

lijinma發表於2017-03-06

背景

第一,我們測試的時候使用 SQLite。

第二,一個正在執行的網站,資料庫的有一些改變,我們一般是會新新增 migration,如下:

    public function up()
    {
        Schema::table('table_name', function (Blueprint $table) {
            $table->dropColumn('column1');
            $table->integer('column2')->comment('.......');
                        //...等等等
        });
    }
    public function down()
    {
        Schema::table('table_name', function (Blueprint $table) {
            $table->dropColumn('column2');
            $table->tinyInteger('column1');
                        //...等等等
        });
    }

問題

以上程式碼在 Mysql 上跑沒有任何問題,不管是 migrate 還是 migrate:rollback 還是 migrate:refresh,都完美執行。

但是在測試(使用 SQLite)的時候,各種詭異的問題,這個欄位不存在,那個欄位有問題...

解決方法

每一個操作都放在一個 Schema::table 的閉包裡面。

    public function up()
    {
        Schema::table('table_name', function (Blueprint $table) {
            $table->dropColumn('column1');
        });
        Schema::table('table_name', function (Blueprint $table) {
            $table->integer('column2')->comment('.......');
        });
                //...等等等
    }
    public function down()
    {
        Schema::table('table_name', function (Blueprint $table) {
            $table->dropColumn('column2');
        });
        Schema::table('table_name', function (Blueprint $table) {
            $table->tinyInteger('column1');
        });
              //...等等等
    }

好多人遇到這個問題,比如:
https://github.com/laravel/framework/issue...

如果你遇到了,不要大驚小怪。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
寫文字大部分時候是因為我希望能幫助到你,小部分時候是想做總結或做記錄。我的微信是 lijinma,希望和你交朋友。 以下是我的公眾賬號,會分享我的學習和成長。

相關文章