CodeIgniter4 數(shù)據(jù)庫遷移

2020-08-17 16:39 更新

遷移是一種有條理、有組織的方式更改數(shù)據(jù)庫的便捷方式。你可以手動編輯SQL的片段,然后你要負責(zé)告訴其他開發(fā)人員他們也需要去運行這段SQL。你還必須跟蹤下次部署時需要對生產(chǎn)機器運行哪些更改。

數(shù)據(jù)庫表遷移會跟蹤已經(jīng)運行的遷移,因此您只需更新應(yīng)用程序文件并調(diào)用$migration->current()以確定應(yīng)運行哪些遷移。當前版本位于application/Config/Migrations.php中。

遷移文件名

每個遷移都按數(shù)字順序向前或向后運行,具體取決于所采用的方法。有兩種編號樣式可供選擇:

  • 順序:每個遷移按順序編號,從001開始。每個數(shù)字必須是三位數(shù),并且序列中不得有任何間隙。(這是CodeIgniter 3.0之前的編號方案。)
  • 時間戳:使用創(chuàng)建遷移時的時間戳對每個遷移進行編號,格式為YYYYMMDDHHIES格式(例如20121031100537)。這有助于防止在團隊環(huán)境中工作時出現(xiàn)編號沖突,并且是CodeIgniter 3.0及更高版本中的首選方案。

可以使用application/Config/Migrations.php文件中的$type設(shè)置選擇所需的樣式。默認設(shè)置為時間戳。

無論您選擇使用哪種編號樣式,請在遷移文件前加上遷移編號,后跟下劃線和遷移的描述性名稱。例如:

  • 001_add_blog.php(順序編號)
  • 20121031100537_add_blog.php(時間戳編號)

創(chuàng)建遷移

這將是新博客站點的首次遷移。所有遷移都在application/Database/Migrations/ 目錄中,并命名,如20121031100537_Add_blog.php。

<?php namespace AppDatabaseMigrations;


class Migration_Add_blog extends CodeIgniterDatabaseMigration {


    public function up() {


        $this->forge->addField([
            ‘blog_id’ => [
                ‘type’ => ‘INT’, ‘constraint’ => 5, ‘unsigned’ => TRUE, ‘a(chǎn)uto_increment’ => TRUE
            ], ‘blog_title’ => [


                ‘type’ => ‘VARCHAR’, ‘constraint’ => ‘100’,
            ], ‘blog_description’ => [


                ‘type’ => ‘TEXT’, ‘null’ => TRUE,
            ],


        ]); $this->forge->addKey(‘blog_id’, TRUE); $this->forge->createTable(‘blog’);


    }


    public function down() {


        $this->forge->dropTable(‘blog’);
    }


}

然后在application/Config/Migrations.php中設(shè)置$currentVersion = 20121031100537;。

數(shù)據(jù)庫連接和數(shù)據(jù)庫Forge類都可以通過 $this->db和$this->forge分別使用。

或者,你可以使用命令行調(diào)用來生成框架遷移文件。請參閱下面的更多細節(jié)。

使用$currentVersion

$currentVersion設(shè)置允許你標記應(yīng)用程序命名空間應(yīng)設(shè)置的位置。這對于在生產(chǎn)環(huán)境中使用尤其有用。在你的應(yīng)用程序中,你始終可以將遷移更新到當前版本,而不是最新版本,以確保生產(chǎn)和登臺服務(wù)器正在運行正確的架構(gòu)。在開發(fā)服務(wù)器上,你可以為尚未準備好生產(chǎn)的代碼添加其他遷移。通過使用該latest()方法,你可以確保你的開發(fā)機器始終運行前沿架構(gòu)。

數(shù)據(jù)庫組

只能針對單個數(shù)據(jù)庫組運行遷移。如果在application/Config/Database.php中定義了多個組 ,則它將針對該$defaultGroup同一配置文件中指定的組運行。有時你可能需要為不同的數(shù)據(jù)庫組使用不同的模式。也許你有一個用于所有常規(guī)站點信息的數(shù)據(jù)庫,而另一個數(shù)據(jù)庫用于關(guān)鍵任務(wù)數(shù)據(jù)。通過$DBGroup在遷移上設(shè)置屬性,可以確保僅針對正確的組運行遷移。此名稱必須與數(shù)據(jù)庫組的名稱完全匹配:

class Migration_Add_blog extends CodeIgniterDatabaseMigration {


    protected $DBGroup = ‘a(chǎn)lternate_db_group’;


    public function up() { … }


    public function down() { … }


}

命名空間

遷移庫可以自動掃描你在application/Config/Autoload.php中定義的所有名稱空間 及其$psr4屬性以匹配目錄名稱。它將包括它在Database/Migrations中找到的所有遷移。

每個命名空間都有自己的版本序列,這將幫助您升級和降級每個模塊(命名空間),而不會影響其他命名空間。

例如,假設(shè)我們在Autoload配置文件中定義了以下命名空間:

$psr4 = [
    ‘App’ => APPPATH, ‘MyCompany’ => ROOTPATH.’MyCompany’
];

這將查找位于APPPATH/Database/MigrationsROOTPATH/Database/Migrations的任何遷移。這使得在可重用的模塊化代碼套件中包含遷移變得簡單。

用法示例

在此示例中,一些簡單的代碼放在application/Controllers/Migrate.php中以更新架構(gòu):

<?php


class Migrate extends CodeIgniterController {


    public function index() {


        $migrate = ConfigServices::migrations();


        try { $migrate->current(); } catch (Exception $e) {


            // Do something with the error here…
        }


    }


}

命令行工具

CodeIgniter附帶了幾個:doc:commands </cli/cli_commands>,它們可以從命令行獲得,以幫助你處理遷移。這些工具不需要使用遷移,但可能會使那些希望使用它們的人更容易。這些工具主要提供對MigrationRunner類中可用的相同方法的訪問。

latest

將所有數(shù)據(jù)庫組遷移到最新的可用遷移:

\& php spark migrate:latest

你可以使用(latest)以下選項:

  • (-g)選擇數(shù)據(jù)庫組,否則將使用默認數(shù)據(jù)庫組。
  • (-n)選擇名稱空間,否則將使用(App)名稱空間。
  • (all)將所有名稱空間遷移到最新的遷移

此示例將Blog名稱空間遷移到latest:

\& php spark migrate:latest -g test -n Blog

current

遷移(App)命名空間以匹配中設(shè)置的版本$currentVersion。這將根據(jù)需要上下移動以匹配指定的版本:

\& php spark migrate:current

你可以使用(current)以下選項:

  • (-g)選擇數(shù)據(jù)庫組,否則將使用默認數(shù)據(jù)庫組。

version

遷移到指定的版本。如果未提供任何版本,系統(tǒng)將提示你輸入該版本。

// Asks you for the version… & php spark migrate:version & Version:

// Sequential & php spark migrate:version 007

// Timestamp & php spark migrate:version 20161426211300

你可以使用(version)以下選項:

  • (-g)選擇數(shù)據(jù)庫組,否則將使用默認數(shù)據(jù)庫組。
  • (-n)選擇名稱空間,否則將使用(App)名稱空間。

rollback

回滾所有遷移,將所有數(shù)據(jù)庫組轉(zhuǎn)為空白平板,有效遷移0:

\& php spark migrate:rollback

你可以使用(rollback)以下選項:

  • (-g)選擇數(shù)據(jù)庫組,否則將使用默認數(shù)據(jù)庫組。
  • (-n)選擇名稱空間,否則將使用(App)名稱空間。
  • (all)將所有名稱空間遷移到最新的遷移

refresh

首先回滾所有遷移,然后遷移到最新版本,刷新數(shù)據(jù)庫狀態(tài):

\& php spark migrate:refresh

你可以使用(refresh)以下選項:

  • (-g)選擇數(shù)據(jù)庫組,否則將使用默認數(shù)據(jù)庫組。
  • (-n)選擇名稱空間,否則將使用(App)名稱空間。
  • (all)將所有名稱空間遷移到最新的遷移

status

顯示所有遷移的列表及其運行的日期和時間,如果尚未運行,則顯示’–’:

\& php spark migrate:status Filename Migrated On First_migration.php 2016-04-25 04:44:22

你可以使用(status)以下選項:

  • (-g)選擇數(shù)據(jù)庫組,否則將使用默認數(shù)據(jù)庫組。

create

使用時間戳格式在application/Database/Migrations中創(chuàng)建框架遷移文件:

\& php spark migrate:create [filename]

你可以使用(create)以下選項:

  • (-n)選擇名稱空間,否則將使用(App)名稱空間。

遷移參數(shù)

以下是application/Config/Migrations.php中提供的所有遷移配置選項的表。

參數(shù) 默認值 可選項 描述
enabled FALSE TRUE/FALSE 啟用或者禁用遷移
path ‘Datebase/Migrations/’ None 遷移文件夾的路徑
currentVersion 0 None 數(shù)據(jù)庫所使用的當前版本
table migrations None 用于存儲當前版本的數(shù)據(jù)庫表名
type ‘timestamp’ ‘timestamp’/’sequential’ 用于命名遷移文件的數(shù)字標識符的類型

類參考

*class*`CodeIgniterDatabaseMigrationRunner`

current($group)

參數(shù): $group (mixed) – database group name, if null (App) namespace will be used.
返回: TRUE if no migrations are found, current version string on success, FALSE on failure
返回類型: mixed

遷移到當前版本(在application / Config / Migrations.php中為$ currentVersion設(shè)置的任何版本)。

findMigrations()

返回: An array of migration files
返回類型: array

返回在path屬性中找到的遷移文件名數(shù)組。

latest($namespace, $group)

參數(shù): $namespace (mixed) – application namespace, if null (App) namespace will be used.
$group (mixed) – database group name, if null default database group will be used.
返回: Current version string on success, FALSE on failure
返回類型: mixed

這與current()的工作方式大致相同,但是Migration類將使用文件系統(tǒng)中找到的最新遷移,而不是尋找$ currentVersion。

latestAll($group)

參數(shù): $group (mixed) – database group name, if null default database group will be used.
返回: TRUE on success, FALSE on failure
返回類型: mixed

這種方式與latest()的工作方式大致相同,但是Migration類不會查找一個名稱空間,而是將使用為所有名稱空間找到的最新遷移。

version($target_version, $namespace, $group)

參數(shù): $namespace (mixed) – application namespace, if null (App) namespace will be used.
$group (mixed) – database group name, if null default database group will be used.
$target_version (mixed) – Migration version to process
返回: TRUE if no migrations are found, current version string on success, FALSE on failure
返回類型: mixed

版本可以用于回滾更改或以編程方式前進到特定版本。 它的工作方式與current()相同,但是會忽略$ currentVersion。

$migration->version(5);

setNamespace($namespace)

參數(shù): $namespace (string) – application namespace.
返回: The current MigrationRunner instance
返回類型: CodeIgniterDatabaseMigrationRunner

設(shè)置庫應(yīng)查找遷移文件的路徑:

$migration->setNamespace($path)
          ->latest();

setGroup($group)

參數(shù): $group (string) – database group name.
返回: The current MigrationRunner instance
返回類型: CodeIgniterDatabaseMigrationRunner

Sets the path the library should look for migration files:

$migration->setNamespace($path)
          ->latest();
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號