📅  最后修改于: 2020-10-16 07:25:16             🧑  作者: Mango
在开发数据库驱动的应用程序期间,数据库结构随源代码一起发展。 Yii提供了数据库迁移功能,可让您跟踪数据库更改。
Yii提供以下迁移命令行工具-
让我们创建一个新的数据库迁移。
步骤1-在基本应用程序模板的项目根目录内,打开控制台窗口并运行。
./yii migrate/create add_news_table
上面的命令将在migrations文件夹中创建一个新的迁移文件(在本例中为m160113_102634_add_news_table.php)。
该文件包含以下代码-
每个数据库迁移都是一个PHP类,扩展了yii \ db \ Migration类。类名以以下格式生成-
m_
其中
在升级数据库时,将调用up()方法,而在降级数据库时,将调用down()方法。
步骤2-要将新表添加到数据库,请以这种方式修改迁移文件。
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()方法中。
新闻表由三个字段组成:ID,标题和内容。创建表或列时,我们应使用抽象类型,以便迁移独立于数据库类型。例如,对于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 migration / new #显示前10个新迁移
yii migration / new 3 #显示前3个新迁移
yii migration / new all #显示所有新的迁移
yii migration / history #显示最近进行的10次迁移
yii migration / history 20 #显示最近进行的20次迁移
yii migration / history all #显示所有已应用的迁移
有时您需要在特定表中添加或删除列。您可以使用addColumn()和dropColumn()方法。
步骤1-创建一个新的迁移。
./yii migrate/create add_category_to_news
步骤2-以这种方式修改新创建的迁移文件。
addColumn('news', 'category', $this->integer());
}
public function down() {
$this->dropColumn('news', 'category');
}
}
?>
现在,如果您运行./yii migration ,则应该将类别列添加到新闻表中。相反,如果运行./yii migration / down 1 ,则应该删除类别列。
执行数据库迁移时,重要的是确保每个迁移都成功或失败。建议将数据库操作包含在事务中。要实现事务性迁移,您只需将迁移代码放入safeUp()和safeDown()方法中。如果这些方法中的任何操作失败,则将回滚所有先前的操作。
之前的“交易方式”示例为-
addColumn('news', 'category', $this->integer());
}
public function safeDown() {
$this->dropColumn('news', 'category');
}
}
?>
yii \ db \ Migration类提供以下用于操作数据库的方法-
execute() -执行原始SQL语句
createTable() -创建一个表
namedTable() -重命名表
insert() -插入一行
batchInsert() -插入多行
update() -更新行
delete() -删除行
addColumn() -添加一列
namedColumn() -重命名列
dropColumn() -删除列
alterColumn() -更改列
dropTable() -删除表
truncateTable() -删除表中的所有行
createIndex() -创建一个索引
dropIndex() -删除索引
addPrimaryKey() -添加一个主键
dropPrimaryKey() -删除主键
addForeignKey() -添加外键
dropForeignKey() -删除外键