1. 程式人生 > >laravel5.5資料庫遷移入門實踐

laravel5.5資料庫遷移入門實踐

Laravel裡面對資料庫設計了一套版本控制方式——資料庫遷移,以下是個人學習入門的實踐過程。

一、生成遷移檔案

1. windows進入進入計算機dos系統,跳轉到專案根目錄,執行以下命令:

(1)第一次生成遷移檔案時,需要先安裝遷移(以後操作不需要執行這一步了)

php artisan migrate:install

(2)生成goods遷移檔案 

// 指定新增一個goods表的遷移檔案
php artisan make:migration create_goods_table --create=goods

    執行後如下:

  

2. 此時在/database/migrations/下生成了遷移檔案:

3. 遷移檔案內容結構

<?php

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

class CreateGoodsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('goods', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('goods');
    }
}

說明:

(1)up方法是用於新增表、列及索引到資料庫;

(2)down方法是up的反方法。

二、設計表結構

目標是建一個goods表,包含欄位有:id(主鍵、自增)、goods_name(varchar型別,長度60)、goods_price(decimal型別,長度10,精確到小數點後2位)、num(庫存數量,Int型別)、descr(商品描述,text型別),編輯up方法,程式碼如下:

public function up()
    {
        Schema::create('goods', function (Blueprint $table) {
            $table->increments('id');               // 資料庫主鍵自增ID
            $table->string('goods_name',60);        // 商品名稱,varchar,長度限制為60
            $table->decimal('goods_price',10,2);    // 商品價格,decimal,長度10,精度2
            $table->integer('num');                 // 商品數量,int
            $table->text('descr');                  // 商品描述,text
            // $table->timestamps();                // 自動增加一個create_at、update_at時間欄位,此處不要
        });
    }

注意:

1. 遷移檔案生成的資料表引擎預設為“MYISAM”,如果要生成“INNODB”引擎,需要在遷移檔案總加入:

$table->engine = 'InnoDB';

2. 如果要指定表字符集為utf8,需要加入:

$table->charset = 'utf8';

      資料型別對應的設定欄位函式參考下表,拷貝自Laravel5.5手冊:

命令 描述
$table->bigIncrements('id'); 自增ID,型別為bigint
$table->bigInteger('votes'); 等同於資料庫中的 BIGINT 型別
$table->binary('data'); 等同於資料庫中的 BLOB 型別
$table->boolean('confirmed'); 等同於資料庫中的 BOOLEAN 型別
$table->char('name', 4); 等同於資料庫中的 CHAR 型別
$table->date('created_at'); 等同於資料庫中的 DATE 型別
$table->dateTime('created_at'); 等同於資料庫中的 DATETIME 型別
$table->dateTimeTz('created_at'); 等同於資料庫中的 DATETIME 型別(帶時區)
$table->decimal('amount', 5, 2); 等同於資料庫中的 DECIMAL 型別,帶一個精度和範圍
$table->double('column', 15, 8); 等同於資料庫中的 DOUBLE 型別,帶精度, 總共15位數字,小數點後8位
$table->enum('choices', ['foo', 'bar']); 等同於資料庫中的 ENUM 型別
$table->float('amount'); 等同於資料庫中的 FLOAT 型別
$table->increments('id'); 資料庫主鍵自增ID
$table->integer('votes'); 等同於資料庫中的 INTEGER 型別
$table->ipAddress('visitor'); 等同於資料庫中的 IP 地址
$table->json('options'); 等同於資料庫中的 JSON 型別
$table->jsonb('options'); 等同於資料庫中的 JSONB 型別
$table->longText('description'); 等同於資料庫中的 LONGTEXT 型別
$table->macAddress('device'); 等同於資料庫中的 MAC 地址
$table->mediumIncrements('id'); 自增ID,型別為無符號的 mediumint
$table->mediumInteger('numbers'); 等同於資料庫中的 MEDIUMINT 型別
$table->mediumText('description'); 等同於資料庫中的 MEDIUMTEXT 型別
$table->morphs('taggable'); 新增一個 INTEGER 型別的 taggable_id 列和一個 STRING 型別的 taggable_type 列
$table->nullableTimestamps(); 和 timestamps() 一樣但允許 NULL 值
$table->rememberToken(); 新增一個 remember_token 列: VARCHAR(100) NULL
$table->smallIncrements('id'); 自增ID,型別為無符號的 smallint
$table->smallInteger('votes'); 等同於資料庫中的 SMALLINT 型別
$table->softDeletes(); 新增一個 deleted_at 列用於軟刪除
$table->string('email'); 等同於資料庫中的 VARCHAR 列
$table->string('name', 100); 等同於資料庫中的 VARCHAR,帶一個長度
$table->text('description'); 等同於資料庫中的 TEXT 型別
$table->time('sunrise'); 等同於資料庫中的 TIME 型別
$table->timeTz('sunrise'); 等同於資料庫中的 TIME 型別(帶時區)
$table->tinyInteger('numbers'); 等同於資料庫中的 TINYINT 型別
$table->timestamp('added_on'); 等同於資料庫中的 TIMESTAMP 型別
$table->timestampTz('added_on'); 等同於資料庫中的 TIMESTAMP 型別(帶時區)
$table->timestamps(); 新增 created_at 和 updated_at 列
$table->timestampsTz(); 新增 created_at 和 updated_at 列(帶時區)
$table->unsignedBigInteger('votes'); 等同於資料庫中無符號的 BIGINT 型別
$table->unsignedInteger('votes'); 等同於資料庫中無符號的 INT 型別
$table->unsignedMediumInteger('votes'); 等同於資料庫中無符號的 MEDIUMINT 型別
$table->unsignedSmallInteger('votes'); 等同於資料庫中無符號的 SMALLINT 型別
$table->unsignedTinyInteger('votes'); 等同於資料庫中無符號的 TINYINT 型別
$table->uuid('id'); 等同於資料庫的UUID

      每一個欄位都可以進行註釋和增加預設值,需要使用“列修改器”:

修改器 描述
->after('column') 將該列置於另一個列之後 (僅適用於MySQL)
->comment('my comment') 添加註釋資訊
->default($value) 指定列的預設值
->first() 將該列置為表中第一個列 (僅適用於MySQL)
->nullable() 允許該列的值為NULL
->storedAs($expression) 建立一個儲存生成列(只支援MySQL)
->unsigned() 設定 integer 列為 UNSIGNED
->virtualAs($expression) 建立一個虛擬生成列(只支援MySQL)

  列修改器使用舉例:

Schema::table('goods', function ($table) {
    $table->string('goods_name',60)->nullable();    // 允許商品名稱為空
    $table->integer('num')->comment('商品數量');     //添加註釋“商品數量”
});

三、執行遷移

  執行遷移前,我囉嗦一句,先到.env把資料庫連線配置好!!!遇到某些同學,真的是哭笑不得。

  進入dos系統,跳轉到專案根目錄,執行以下程式碼:

php artisan migrate

  執行後如下:

  

  到資料庫檢視,此處是用的navicat for mysql:

  

四、回滾遷移(練習操作)

  如果要回滾剛才的遷移操作,可以在dos系統下使用如下命令:

php artisan migrate:rollback

  如果要回滾之前多步遷移操作的話,可以在執行如下命令:

php artisan migrate:rollback --step=5  //此處5代表回滾5步遷移操作

五、全部回滾

php artisan migrate:refresh

  注意:全部回滾後,資料庫所有已有資料全部清除。 

六、修改資料列(欄位及其屬性,練習操作)

1. 在執行修改前,在dos下執行以下命令確保將 doctrine/dbal 依賴新增到 composer.json 中,Doctrine DBAL 庫用於判斷列的當前狀態並建立對列進行指定調整所需的 SQL 語句:

composer require doctrine/dbal

2. 建立修改遷移檔案

php artisan make:migration alter_goods_table --table=goods

3. 更新列(欄位)的屬性,使用 change() 方法:

Schema::table('goods', function ($table) {
    $table->string('goods_name', 40)->change();    // 將商品名稱修改為長度限制為40
});
Schema::table('goods', function ($table) {
    $table->string('goods_name', 40)->nullable()->change();    // 將商品名稱修改為允許NULL
});

  注意以下資料型別是不能修改:char、double、enum、mediumInteger、timestamp、tinyInteger、ipAddress、json、jsonb、macAddress、mediumIncrements、morphs、nullableMorphs、nullableTimestamps、softDeletes、timeTz、timestampTz、timestamps、timestampsTz、unsignedMediumInteger、unsignedTinyInteger、uuid。

4. 重命令資料列,使用  renameColumn() 方法:

Schema::table('goods', function ($table) {
    $table->renameColumn('num', 'number');    //修改num欄位為number
});

注意:暫時不支援 enum 型別 的列的修改和重新命名

5. 新增資料列

Schema::table('goods', function ($table) {
    $table->string('look_num');             // 新增一個look_num欄位
});

6. 刪除資料列 ,使用 dropColumn() 方法:

Schema::table('goods', function ($table) {
    $table->dropColumn('goods_name');                            //刪除一個數據列
    $table->dropColumn(['goods_name', 'goods_price', 'num']);    //刪除多個數據列
});

7. 建立索引

    建立索引可以有兩種方式,一種方式是在建立資料列的同時就建立索引,另一種方法是先建立資料列,然後再建立索引,如下:

 Schema::create('goods', function (Blueprint $table) {
            // 1. 建立資料列的同時建立唯一索引
            $table->string('goods_name',60)->unique();

            // 2.先建立資料列,再建立索引
            $table->string('goods_name',60);
            $table->unique('goods_name');
 });

      可用索引型別如下:

命令 描述
$table->primary('id'); 新增主鍵索引
$table->primary(['first', 'last']); 新增混合索引
$table->unique('email'); 新增唯一索引
$table->unique('state', 'my_index_name'); 指定自定義索引名稱
$table->unique(['first', 'last']); 新增組合唯一索引
$table->index('state'); 新增普通索引

8. 執行遷移檔案完成修改

php artisan migrate

結語: 資料庫遷移檔案可以做資料庫結構版本控制,但是一旦有了資料,仍然還是隻進行資料庫結構版本控制,對於實際應用來說,也不能算是真正的版本控制,資料庫裡面的資料能做到版本控制,那對於利用git進行版本控制的公司和開發團隊來講,才真正算是對資料庫也進行了版本控制,資料填充參考:

相關推薦

laravel5.5資料庫遷移入門實踐

Laravel裡面對資料庫設計了一套版本控制方式——資料庫遷移,以下是個人學習入門的實踐過程。 一、生成遷移檔案 1. windows進入進入計算機dos系統,跳轉到專案根目錄,執行以下命令: (1)第一次生成遷移檔案時,需要先安裝遷移(以後操作不需要執行這一步了)

Laravel5.5 資料庫遷移:建立與修改表

資料庫遷移是資料庫的版本管理,要使用資料庫遷移,需要在.env檔案中連線好資料庫(不多說)。laravel本身已經存在user表和password_resets表的遷移了,因此,執行 php artisan migrate 便會在資料庫中建立好user表、passwo

laravel5.5資料庫之資料填充(實踐

前要:laravel5.5資料庫遷移可以參考我的上一篇博文:laravel5.5資料庫遷移入門實踐 一、背景         常常在做專案的過程中,會使用很多的測試資料,而因為團隊開發,如果每個人的測試資料都不一致,會出現各種測試問題,所以有必要對資料庫中的測試資料也進行

最火的分散式 HTAP 資料庫 TiDB - 入門實踐教程

    偶然在某篇部落格看到了 TiDB,一個融合 OLTP 和 OLAP 的分散式開源資料庫, GitHub 上 Star 很多,然後 watch 了,發現 commit 和 pull request 一直都很頻繁。 後面又看到 TiDB 在小米的應用實踐

laravel5.5 遷移資料庫 出錯(三)

錯誤提示 In Connection.php line 664: SQLSTATE[42S01]: Base table or view already exists: 1050 Table

spring boot 1.5.4 從入門實踐

springbootSpring Boot四個重要核心:自動配置:針對很多Sping應用程序常見的應用功能,Spring Boot能自動提供相關配置;起步依賴:告訴Spring Boot需要什麽功能,它就能引入需要的庫;命令行界面:這是Spring Boot的可選特性,借此你只需寫代碼就能完成完整的應用程序,

Laravel5.5執行表遷移命令出現表為空的解決方案

今天在使用一個第三方包 laravel-admin 時,出現了這樣的錯誤: SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name '',折騰了好久,終於知道了解決方法,原來是配置檔案的快取沒有清理。

Spring+SpringMVC+MyBatis入門實踐5

註解方式AOP 註解配置切面 @Aspect 註解表示這是一個切面 @Component 表示這是一個bean,由Spring進行管理 @Around(value = “execution(* com.happycoder.service.ProductServ

zabbix遷移資料庫遷移 5.1-5.6

2016-07-04 23:29:20 24086 [ERROR] Native table 'performance_schema'.'table_io_waits_summary_by_index_usage' has the wrong structure 2016-07-04 23:29:20 24

Laravel5.5原始碼詳解 -- 資料庫的啟動與連線過程

Laravel5.5原始碼詳解 – 資料庫的啟動與連線過程 整個laravel的操作,一般情況下,資料庫的處理會佔掉很大一部分。所以對資料 庫處理的理解,顯得尤為重要。關於其原始碼解析,網上有非常多的文獻,但流程一般都含糊其辭,讀完來龍去脈甚為不解。所以,我自

新手學習laravel框架-laravel5.5框架入門

剛開始學習laravel框架時,我也不知道從何入手,首先就從檔案目錄開始,找到專案入口檔案,然後進行配置執行。注意:在配置執行時,要注意PHP的版本是否符合要求以及下列擴充套件是否開啟,否則執行不能成功:PHP OpenSSL 擴充套件PHP PDO 擴充套件PHP Mbst

資料庫實踐操作(二)--資料庫遷移方案

例如:開發好的銀行系統進行遷移 介紹四種方法 1>分離附加法(常當前資料庫中分離) 前提:該資料庫不處於被訪問狀態 1>開啟要分離的資料庫檔案位置 右擊資料庫屬性–檔案–複製路徑–win+R開啟路徑 注意:開啟這一

laravel5.5在第一次執行資料遷移,系統報錯(入坑)

 資料遷移    * 所有建立的遷移檔案都被統一放在 database/migrations 資料夾  * Laravel 預設建立的兩個遷移檔案,一個用於構建使用者表,一個用於構建密碼重置表  *   *      database/migrations/2014_10_1

Laravel 實踐之路: 資料庫遷移與資料填充

資料庫遷移實際上就是對資料庫庫表的結構變化做版本控制,之前對資料庫庫表結構做修改的方式比較原始,比如說對某張庫表新增了一個欄位,都是直接在庫表中執行alter table xxx add .. 的方式直接修改,但是這麼做有些弊端,比如在開發階段,你自己的庫表修改了,還要把這

es6+最佳入門實踐(5)

code pre sig 方法 視頻教程 運算符 on() n) rip 5.對象擴展 5.1.對象簡寫 在es5中,有這樣一種寫法 var name = "xiaoqiang"; var age = 12; var obj = { name : name,

cassandra百億級資料庫遷移實踐

遷移背景 cassandra叢集隔段時間出現rt飆高的問題,帶來的影響就是請求cassandra短時間內出現大量超時,這個問題發生已經達到了平均兩週一次的頻率,已經影響到正常業務了。而出現這些問題的原因主要有以下3點: 當初設計表的時候partition key設計的不是很合理,當資料量上去(最大的單錶行數

Laravel5.x的php artisan migrate資料庫遷移建立操作報錯SQLSTATE[42000]解決

Laravel5.x執行遷移命令建立資料表:php artisan migrate報錯。 Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified

Android自己定義組件系列【5】——進階實踐(2)

col fonts tle 適配 pack tom ica void log 上一篇《Android自己定義組件系列【5】——進階實踐(1)》中對任老師的《可下拉的PinnedHeaderExpandableListView的實現》前一部分進行了實現,這一篇我們來看看Ex

【Qt入門實踐】Qt之哲學家問題(linux 多線程)

avi .cpp private 1=1 endif debug 問題 tel pub 轉載請註明出處:http://blog.csdn.net/feng1790291543 linux多線程實現哲學家問題,依據哲學家吃飯、拿筷子、放下筷子...... 首先,主

Laravel5.5執行 npm run dev時報錯,提示cross-env找不到(not found)的解決辦法

smo font span links 命令 develop ebp amp webpack Laravel 5.4 Mix & Laravel5.5執行 npm run dev時報錯,提示cross-env找不到(not found)的解決辦法 首先