- Yii 教程
- Yii - 首页
- Yii - 概述
- Yii - 安装
- Yii - 创建页面
- Yii - 应用程序结构
- Yii - 入口脚本
- Yii - 控制器
- Yii - 使用控制器
- Yii - 使用操作
- Yii - 模型
- Yii - 小部件
- Yii - 模块
- Yii - 视图
- Yii - 布局
- Yii - 资源
- Yii - 资源转换
- Yii - 扩展
- Yii - 创建扩展
- Yii - HTTP 请求
- Yii - 响应
- Yii - URL 格式
- Yii - URL 路由
- Yii - URL 规则
- Yii - HTML 表单
- Yii - 验证
- Yii - 特设验证
- Yii - AJAX 验证
- Yii - 会话
- Yii - 使用闪存数据
- Yii - Cookie
- Yii - 使用 Cookie
- Yii - 文件上传
- Yii - 格式化
- Yii - 分页
- Yii - 排序
- Yii - 属性
- Yii - 数据提供程序
- Yii - 数据小部件
- Yii - ListView 小部件
- Yii - GridView 小部件
- Yii - 事件
- Yii - 创建事件
- Yii - 行为
- Yii - 创建行为
- Yii - 配置
- Yii - 依赖注入
- Yii - 数据库访问
- Yii - 数据访问对象
- Yii - 查询生成器
- Yii - Active Record
- Yii - 数据库迁移
- Yii - 主题
- Yii - RESTful API
- Yii - RESTful API 实践
- Yii - 字段
- Yii - 测试
- Yii - 缓存
- Yii - 片段缓存
- Yii - 别名
- Yii - 日志记录
- Yii - 错误处理
- Yii - 身份验证
- Yii - 授权
- Yii - 本地化
- Yii - Gii
- Gii – 创建模型
- Gii – 生成控制器
- Gii – 生成模块
- Yii 有用资源
- Yii - 快速指南
- Yii - 有用资源
- Yii - 讨论
Yii - 数据库迁移
在开发数据库驱动的应用程序期间,数据库结构会随着源代码一起发展。Yii 提供了**数据库迁移**功能,允许您跟踪数据库的变化。
Yii 提供以下迁移命令行工具:
- 创建新的迁移
- 回滚迁移
- 应用迁移
- 重新应用迁移
- 显示迁移状态和历史记录
创建迁移
让我们创建一个新的数据库迁移。
**步骤 1** - 在基本应用程序模板的项目根目录中打开控制台窗口并运行。
./yii migrate/create add_news_table
以上命令将在**migrations**文件夹中创建一个新的迁移文件(在本例中为 m160113_102634_add_news_table.php)。
该文件包含以下代码:
<?php use yii\db\Schema; use yii\db\Migration; class m160113_102634_add_news_table extends Migration { public function up() { } public function down() { echo "m160113_102634_add_news_table cannot be reverted.\n"; return false; } /* // Use safeUp/safeDown to run migration code within a transaction public function safeUp() { } public function safeDown() { } */ } ?>
每个数据库迁移都是一个扩展**yii\db\Migration**类的 PHP 类。类名按以下格式生成:
m<YYMMDD_HHMMSS>_<Name>
其中**<YYMMDD_HMMSS>**是执行迁移命令时的 UTC 日期时间,<Name> 是您在控制台命令中提供的参数。
当您升级数据库时调用 up() 方法,而当您降级数据库时调用 down() 方法。
**步骤 2** - 要向数据库添加新表,请按以下方式修改迁移文件。
<?php use yii\db\Schema; use yii\db\Migration; class m160113_102634_add_news_table extends Migration { public function up() { $this->createTable("news", [ "id" => Schema::TYPE_PK, "title" => Schema::TYPE_STRING, "content" => Schema::TYPE_TEXT, ]); } public function down() { $this->dropTable('news'); } /* // Use safeUp/safeDown to run migration code within a transaction public function safeUp() { } public function safeDown() { } */ } ?>
在以上代码中,我们在**up()**方法中创建了一个名为 news 的新表,并在**down()**方法中删除了该表。
**news**表包含三个字段:id、title 和 content。在创建表或列时,我们应该使用抽象类型,以便迁移独立于数据库类型。例如,在 MySQL 的情况下,TYPE_PK 将转换为 int(11) NOT NUL AUTO_INCREMETN PRIMARY KEY。
**步骤 3** - 要升级数据库,请运行此命令。
./yii migrate
以上命令将列出所有尚未应用的可用迁移。然后,如果您确认应用迁移,它将在所有新的迁移类中运行 safeUp() 或 up()。
**步骤 4** - 要仅应用三个可用的迁移,您可以运行。
./yii migrate 3
**步骤 5** - 您还可以定义数据库应迁移到的特定迁移。
# 使用时间戳指定迁移
yii migrate/to 160202_195501
# 使用 strtotime() 可解析的字符串
yii migrate/to "2016-01-01 19:55:01"
# 使用完整名称
yii migrate/to m160202_195501_create_news_table
# 使用 UNIX 时间戳
yii migrate/to 1393964718
**步骤 6** - 要回滚迁移(执行 down() 或 safeDown() 方法),请运行。
./yii migrate/down
**步骤 7** - 要回滚最近应用的五个迁移,您可以运行。
./yii migrate/down 5
**步骤 8** - 要重做(回滚然后重新应用)迁移,请运行。
./yii migrate/redo
要列出已应用的迁移,请使用以下命令:
yii migrate/new # 显示前 10 个新的迁移
yii migrate/new 3 # 显示前 3 个新的迁移
yii migrate/new all # 显示所有新的迁移
yii migrate/history # 显示最后 10 个已应用的迁移
yii migrate/history 20 # 显示最后 20 个已应用的迁移
yii migrate/history all # 显示所有已应用的迁移
有时您需要从特定表中添加或删除列。您可以使用**addColumn()**和**dropColumn()**方法。
**步骤 1** - 创建新的迁移。
./yii migrate/create add_category_to_news
**步骤 2** - 按以下方式修改新创建的迁移文件。
<?php use yii\db\Schema; use yii\db\Migration; class m160113_110909_add_category_to_news extends Migration { public function up() { $this->addColumn('news', 'category', $this->integer()); } public function down() { $this->dropColumn('news', 'category'); } } ?>
现在,如果您运行**./yii migrate**,则 category 列应添加到 news 表中。相反,如果您运行**./yii migrate/down 1**,则应删除 category 列。
在执行数据库迁移时,务必确保每个迁移都成功或失败。建议将数据库操作包含在事务中。要实现事务迁移,您只需将迁移代码放在**safeUp()**和**safeDown()**方法中即可。如果这些方法中的任何操作失败,所有先前操作都将回滚。
“事务方式”中的上一个示例将是:
<?php use yii\db\Schema; use yii\db\Migration; class m160113_110909_add_category_to_news extends Migration { public function safeUp() { $this->addColumn('news', 'category', $this->integer()); } public function safeDown() { $this->dropColumn('news', 'category'); } } ?>
**yii\db\Migration**类提供了以下用于操作数据库的方法:
execute() - 执行原始 SQL 语句
createTable() - 创建表
renameTable() - 重命名表
insert() - 插入一行
batchInsert() - 插入多行
update() - 更新行
delete() - 删除行
addColumn() - 添加列
renameColumn() - 重命名列
dropColumn() - 删除列
alterColumn() - 更改列
dropTable() - 删除表
truncateTable() - 删除表中的所有行
createIndex() - 创建索引
dropIndex() - 删除索引
addPrimaryKey() - 添加主键
dropPrimaryKey() - 删除主键
addForeignKey() - 添加外键
dropForeignKey() - 删除外键