[TOC]
# 數據庫遷移
遷移是一種以結構化和有組織的方式更改數據庫的便捷方式。
>[danger] Phalcon開發者工具中提供了遷移您至少需要Phalcon Framework 0.5.0才能使用開發人員工具。
通常在開發中,我們需要更新生產環境中的更改。其中一些更改可能是數據庫修改,如新字段,新表,刪除索引等。
生成遷移時,會創建一組類來描述在特定時刻數據庫的結構。這些類可用于同步遠程數據庫上的模式結構,使您的數據庫可以使用應用程序實現的新更改。遷移使用普通PHP描述這些轉換。
## 架構轉儲
[Phalcon開發者工具](https://github.com/phalcon/docs/blob/3.3/zh/devtools-usage.md) 提供了用于管理遷移(生成,運行和回滾)的腳本。
用于生成遷移的可用選項包括:

在沒有任何參數的情況下運行此腳本只會將數據庫中的每個對象(表和視圖)轉儲到遷移類中。
每個遷移都有一個與之關聯的版本標識符。版本號允許我們確定遷移是否比我們數據庫的當前“版本”更新或更舊。版本還將在執行遷移時通知Phalcon正在運行的訂單。

生成遷移時,控制臺上會顯示說明,以描述遷移的不同步驟和這些語句的執行時間。最后,生成遷移版本。
默認情況下,Phalcon開發者工具使用`app/migrations`目錄轉儲遷移文件。您可以通過在生成腳本上設置其中一個參數來更改位置。數據庫中的每個表都在一個分隔文件中生成其各自的類,該文件位于引用其版本的目錄下:

## 遷移類解剖
每個文件都包含一個擴展`Phalcon\Mvc\Model\Migration`類的唯一類。這些類通常有兩種方法:`up()`和`down()`。`up()`執行遷移,而`down()`將其回滾。
`up()` 還包含magic方法`morphTable()`。當它識別出將數據庫中的實際表與給定描述同步所需的更改時,就會產生魔術方法。
```php
<?php
use Phalcon\Db\Column as Column;
use Phalcon\Db\Index as Index;
use Phalcon\Db\Reference as Reference;
use Phalcon\Mvc\Model\Migration;
class ProductsMigration_100 extends Migration
{
public function up()
{
$this->morphTable(
'products',
[
'columns' => [
new Column(
'id',
[
'type' => Column::TYPE_INTEGER,
'size' => 10,
'unsigned' => true,
'notNull' => true,
'autoIncrement' => true,
'first' => true,
]
),
new Column(
'product_types_id',
[
'type' => Column::TYPE_INTEGER,
'size' => 10,
'unsigned' => true,
'notNull' => true,
'after' => 'id',
]
),
new Column(
'name',
[
'type' => Column::TYPE_VARCHAR,
'size' => 70,
'notNull' => true,
'after' => 'product_types_id',
]
),
new Column(
'price',
[
'type' => Column::TYPE_DECIMAL,
'size' => 16,
'scale' => 2,
'notNull' => true,
'after' => 'name',
]
),
],
'indexes' => [
new Index(
'PRIMARY',
[
'id',
]
),
new Index(
'product_types_id',
[
'product_types_id',
]
),
],
'references' => [
new Reference(
'products_ibfk_1',
[
'referencedSchema' => 'invo',
'referencedTable' => 'product_types',
'columns' => ['product_types_id'],
'referencedColumns' => ['id'],
]
),
],
'options' => [
'TABLE_TYPE' => 'BASE TABLE',
'ENGINE' => 'InnoDB',
'TABLE_COLLATION' => 'utf8_general_ci',
],
]
);
}
}
```
該類稱為`ProductsMigration_100`。后綴100指的是版本1.0.0。`morphTable()` 接收一個包含4個可能部分的關聯數組:
| Index | 描述 | 是否可選 |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |:--------:|
| `columns` | 帶有一組表列的數組 | No |
| `indexes` | 包含一組表索引的數組。 | Yes |
| `references` |帶有一組表引用(外鍵)的數組。 | Yes |
| `options` | 包含一組表創建選項的數組。這些選項通常與生成遷移的數據庫系統相關。| Yes |
### 列定義
`Phalcon\Db\Column` 用于定義表列。它封裝了各種與列相關的功能。它的構造函數接收列名稱和描述列的數組作為第一個參數。描述列時可以使用以下選項:
| 選項 | 描述 | 是否可選 |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |:--------:|
| `type` | 列類型。必須是`Phalcon\Db\Column` 常量(見下文) | No |
| `size` | 某些類型的列(如`VARCHAR`或`INTEGER`)可能具有特定大小 | Yes |
| `scale` | `DECIMAL` 或 `NUMBER` 列可以有一個比例來指定它必須存儲多少小數 | Yes |
| `unsigned` | `INTEGER` 列可以是有符號或無符號的。此選項不適用于其他類型的列 | Yes |
| `notNull` | 列可以存儲 null 值嗎? | Yes |
| `default` | 定義列的默認值(只能是實際值,而不是 `NOW()`等函數)) | Yes |
| `autoIncrement` | 使用此屬性列將自動填充自動增量整數。表中只有一列可以具有此屬性。| Yes |
| `primary` | 使用`columnName_pkey` 作為標識符將此列設置為主鍵索引。類型 - `BOOLEAN` | Yes |
| `first` | 列必須按列順序放置在第一個位置 | Yes |
| `after` | 必須在指定的列之后放置 | Yes |
數據庫遷移支持以下數據庫列類型:
* `Phalcon\Db\Column::TYPE_INTEGER`
* `Phalcon\Db\Column::TYPE_VARCHAR`
* `Phalcon\Db\Column::TYPE_CHAR`
* `Phalcon\Db\Column::TYPE_DATE`
* `Phalcon\Db\Column::TYPE_DATETIME`
* `Phalcon\Db\Column::TYPE_TIMESTAMP`
* `Phalcon\Db\Column::TYPE_DECIMAL`
* `Phalcon\Db\Column::TYPE_TEXT`
* `Phalcon\Db\Column::TYPE_BOOLEAN`
* `Phalcon\Db\Column::TYPE_FLOAT`
* `Phalcon\Db\Column::TYPE_DOUBLE`
* `Phalcon\Db\Column::TYPE_TINYBLOB`
* `Phalcon\Db\Column::TYPE_BLOB`
* `Phalcon\Db\Column::TYPE_MEDIUMBLOB`
* `Phalcon\Db\Column::TYPE_LONGBLOB`
* `Phalcon\Db\Column::TYPE_JSON`
* `Phalcon\Db\Column::TYPE_JSONB`
* `Phalcon\Db\Column::TYPE_BIGINTEGER`
### 索引定義
`Phalcon\Db\Index` 定義表索引。索引僅要求您為其定義名稱及其列的列表。請注意,如果任何索引的名稱為`PRIMARY`,Phalcon將為該表創建主鍵索引。
### 引用定義
`Phalcon\Db\Reference` 定義表引用(也稱為外鍵)。以下選項可用于定義引用:
| Index | 描述 | 是否可選 | 作用于 |
| ------------------- | --------------------------------------------------------------------------------------------------- |:--------:| ---------------- |
| `referencedTable` | 它是自動描述性的。它指的是引用表的名稱。 | No | All |
| `columns` | 一個數組,其中包含表中具有引用的列的名稱| No | All |
| `referencedColumns` | 一個數組,其中包含引用表中列的名稱 | No | All |
| `referencedSchema` | 引用的表可能在另一個模式或數據庫上。此選項允許您定義它。 | Yes | All |
| `onDelete` | 如果刪除了外部記錄,請在本地記錄上執行此操作。 | Yes | MySQL PostgreSQL |
| `onUpdate` | 如果更新了外部記錄,請對本地記錄執行此操作。 | Yes | MySQL PostgreSQL |
## 編寫遷移
遷移不僅設計為“變形”表。遷移只是一個常規的PHP類,因此您不僅限于這些函數。例如,在添加列之后,您可以編寫代碼來為現有記錄設置該列的值。有關各個方法的更多詳細信息和示例,請檢查數據庫組件。
```php
<?php
use Phalcon\Mvc\Model\Migration;
class ProductsMigration_100 extends Migration
{
public function up()
{
// ...
self::$_connection->insert(
'products',
[
'Malabar spinach',
14.50,
],
[
'name',
'price',
]
);
}
}
```
## 運行遷移
生成的遷移在目標服務器上上傳后,您可以輕松運行它們,如以下示例所示:


根據數據庫在遷移方面的過時程度,Phalcon可能會在同一遷移過程中運行多個遷移版本。如果指定目標版本,Phalcon將運行所需的遷移,直到達到指定的版本。
- 常規
- Welcome
- 貢獻
- 生成回溯
- 測試重現
- 單元測試
- 入門
- 安裝
- Web服務器設置
- WAMP
- XAMPP
- 教程
- 基礎教程
- 教程:創建一個簡單的REST API
- 教程:V?kuró
- 提升性能
- 教程:INVO
- 開發環境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 開發工具
- Phalcon開發者工具的安裝
- Phalcon開發者工具的使用
- 調試應用程序
- 核心
- MVC應用
- 微應用
- 創建命令行(CLI)應用程序
- 依賴注入與服務定位
- MVC架構
- 服務
- 使用緩存提高性能
- 讀取配置
- 上下文轉義
- 類加載器
- 使用命名空間
- 日志
- 隊列
- 數據庫
- 數據庫抽象層
- Phalcon查詢語言(PHQL)
- ODM(對象文檔映射器)
- 使用模型
- 模型行為
- ORM緩存
- 模型事件
- 模型元數據
- 模型關系
- 模型事務
- 驗證模型
- 數據庫遷移
- 分頁
- 前端
- Assets管理
- 閃存消息
- 表單
- 圖像
- 視圖助手(標簽)
- 使用視圖
- Volt:模板引擎
- 業務邏輯
- 訪問控制列表(ACL)
- 注解解析器
- 控制器
- 調度控制器
- 事件管理器
- 過濾與清理
- 路由
- 在session中存儲數據
- 生成URL和路徑
- 驗證
- HTTP
- Cookies管理
- 請求環境
- 返回響應
- 安全
- 加密/解密
- 安全
- 國際化
- 國際化
- 多語言支持