openbuildings / timestamped-migrations
迁移是一种方便的方式,让您以结构化和组织化的方式更改数据库
Requires
- php: ^7
- composer/installers: ^1
- kohana/core: ^3.3
- kohana/database: ^3.3
- kohana/minion: ^3.3
Requires (Dev)
This package is not auto-updated.
Last update: 2020-01-24 15:17:29 UTC
README
迁移是一种方便的方式,让您以结构化和组织化的方式更改数据库。您可以手动编辑SQL片段,但您需要负责告诉其他开发人员他们需要运行这些片段。您还必须跟踪下一次部署时需要针对生产机器运行哪些更改。
迁移模块跟踪已运行的迁移,因此您只需更新源代码并运行 ./minion db:migrate。迁移模块将确定应运行哪些迁移。
迁移还允许您使用PHP描述这些转换。好的一点是它是数据库无关的:您不必像担心SELECT *的变体那样担心CREATE TABLE的确切语法(您可以为特定数据库功能降级到原始SQL)。例如,您可以在开发中使用SQLite3,但在生产中使用MySQL。
依赖项
此模块利用内置的Kohana-minion用于其命令行界面。尽管系统与它相当解耦,但您仍然可以轻松地将它与其他cli工具结合使用,如果您使用不同的工具。
选项
- log - 这是用于集成的日志函数,用于您使用的任何控制器/后端
- path - 存储迁移的路径,默认为APPATH/migrations
- type - 后端迁移的驱动程序以及已执行迁移本身,默认为mysql
迁移命令行工具
此模块提供了一组kohana-minion任务来处理迁移,使您能够轻松创建、运行和回滚它们。所有这些都有详细的文档,您可以使用kohana-minion内置的命令轻松阅读,例如。
./minion db:migrate --help
迁移所有新迁移
您可能使用的最常用的迁移相关任务将是 db:migrate
。在其最基本的形式中,它仅运行尚未执行的所有新迁移版本的上方法。如果没有此类迁移,它将退出。
./minion db:migrate
如果您指定了目标版本,Active Record将运行所需的迁移(上或下),直到达到指定的版本。版本是迁移文件名的数字前缀。例如,要迁移到版本1322837510,请运行
./minion db:migrate --version=1322837510
如果这大于当前版本(即正在向上迁移),这将运行所有迁移的上方法,包括1322837510,如果向下迁移,这将运行所有迁移的下方法,但不包括1322837510。
迁移迁移
db:migrate:up
将迁移第一个尚未迁移的迁移版本。
./minion db:migrate:up
回滚迁移
使用db:migration:down
命令可以回滚最近的迁移,例如如果你在迁移中犯了错误并希望纠正它。你无需追踪与之前迁移关联的版本号,可以直接运行以下步骤而不指定任何版本号。
./minion db:migrate:down
重新执行迁移
db:migrate:redo
任务是一个回滚然后再次迁移的快捷方式。它将执行db:migrate:down,然后再次执行db:migrate:up。
./minion db:migrate:redo
迁移指定版本
如果你需要运行特定版本的迁移上下文,可以使用db:migrate:up
和db:migrate:down
命令。只需指定相应的版本,相应的迁移将调用其上或下方法,例如
./minion db:migrate:up --version=1321025460
将运行1321025460迁移的上方法。这些命令会检查迁移是否已运行,例如,如果迁移模块认为已经运行了--version=1321025460,则db:migrate:up --version=1321025460将不会执行任何操作。
迁移最后几步
默认情况下,db:migrate:up
、db:migrate:down
和db:migrate:redo
命令仅执行一次迁移。但是,它们支持--step
选项。它允许你一次性迁移多个迁移步骤。例如
./minion db:migrate:down --step=3
将回滚最后3个已迁移的迁移。
这些命令都不会做你用db:migrate做不了的事情,它们只是更方便,因为你不需要明确指定要迁移到的版本。
干运行
你可以添加一个--dry-run
选项,它将只显示将要执行的迁移,而不会实际执行任何操作。
./minion db:migrate:up --step=3 --dry-run
生成迁移
你可以使用db:generate
命令来生成迁移,该命令将在模块配置中指定的路径内创建一个文件。它将以时间戳为文件名前缀并返回创建的文件名
./minion db:generate --name=my_migration
将显示1495194020_my_migration_user.php 迁移文件已生成
。它创建具有up()
和down()
方法的脚手架。迁移文件将如下所示
class My_Migration extends Migration { public function up() { } public function down() { } }
文件名中有几种模式将被识别并转换为迁移的上/下方法中的实际辅助方法。
- create_table_{table}
- drop_table_{table}
- add_{columns}_to_{table} 其中{columns}是列名列表,由
_and_
分隔,因此你可以编写add_name_and_title_to_users
- 这将添加两个列。 - remove_{columns}_from_{table}
- change_{columns}_in_{table}
- rename_table_{old_name}_to_{new_name}
- rename_{old_column_name}_to_{new_column_name}_in_{table_name}
要创建用户表,可以使用以下命令
./minion db:generate --name=create_table_users
<?php defined('SYSPATH') OR die('No direct script access.'); class Create_Users extends Migration { public function up() { $this->create_table('users', array( )); } public function down() { $this->drop_table('users'); } } ?>
如果你使用多个模式,并且使用_also_
分隔它们,则可以使用多个模式。例如,要同时创建用户表、列登录和名称,使用以下命令
./minion db:generate --name=create_table_users_also_add_login_and_name
这将创建一个迁移
class Create_Table_Users_Also_Add_Login_And_Name_To_Users extends Migration { public function up() { $this->create_table('users', array( )); $this->add_column('users', 'login', 'string'); $this->add_column('users', 'name', 'string'); } public function down() { $this->drop_table('users'); $this->remove_column('users', 'login'); $this->remove_column('users', 'name'); } }
列类型根据后缀猜测 - _id和_count列将是整数,_at -> datetime,_on -> date,is_ -> boolean,而"描述"和"text"将被假定为文本。列的默认类型是字符串。
如果没有任何模式匹配,它将仅创建一个具有空上和下方法的迁移。
辅助方法
你有一系列辅助方法,这将简化你编写迁移的过程。
- create_table
- 重命名表
- 删除表
- 添加列
- 删除列
- 更改列
- 重命名列
- 添加索引
- 删除索引
- 更改表
如果您需要执行针对您数据库的特定任务(例如创建外键约束),则execute方法允许您执行任意SQL。迁移只是一个普通的PHP类,因此您不受这些函数的限制。例如,在添加列之后,您可以编写代码来设置现有记录(如果需要使用模型)该列的值。
以下是一个所有这些功能都在工作的快速示例
<?php defined('SYSPATH') OR die('No direct script access.'); class Create_User extends Migration { public function up() { $this->create_table( "users", array( 'title' => 'string', 'is_admin' => array('boolean', 'null' => FALSE, 'default' => 0) )); $this->add_column("users", "latlon", array("type" => "POINT")); $this->add_column("users", "email", array("string", "null" => FALSE)); $this->add_index("users", "latlon", "latlon", "spatial"); $this->add_index("users", "search", array("title", "email"), "fulltext"); $this->execute( "INSERT INTO `users` (`id`, `title`, `is_admin`) VALUES(1, 'user1', 1); INSERT INTO `users` (`id`, `title`, `is_admin`) VALUES(2, 'user2', 0);" ); } public function down() { $this->remove_index("users", "latlon"); $this->remove_index("users", "search"); $this->remove_column("users", "email"); $this->remove_column("users", "latlon"); $this->drop_table("users"); } } ?>
列可用的类型有
- 主键
- 字符串
- 文本
- 整数
- 浮点数
- 十进制数
- 日期时间
- 时间戳
- 时间
- 日期
- 二进制
- 布尔值
每个列都可以有如下选项
- after - 在哪个列之后放置此列
- null - TRUE或FALSE
- 默认值
- auto - TRUE或FALSE - 添加自增
- unsigned - TRUE或FALSE
- limit - 限制
- precision - 对
decimal
和float
有效 - primary - TRUE或FALSE
您可以使用自定义数据库类型,为此请跳过列类型并直接定义它
$this->add_column('table', 'column', array('type' => 'BIGINT', 'null' => FALSE, 'unsigned' => TRUE));
$this->add_column('table', 'column', array('type' => 'GEOMETRY', 'null' => FALSE));
function create_table($table, $fields, $options)
选项有
- id - bool - 将此设置为FALSE以防止自动添加id主键。默认为TRUE。
- options将AS IS添加到表定义的末尾。
// Create a table with innoDB, UTF-8 as default charset, and guid for primary key. $this->create_table( "users", array( 'title' => 'string', 'guid' => 'primary_key', 'is_admin' => array('boolean', 'null' => FALSE, 'default' => 0) ), array ( 'id' => FALSE, 'options' => 'ENGINE=innoDB CHARSET=utf8' ));
function add_index($table, $index_name, $columns, $type = 'normal')
您可以为索引传递多个列(作为列名数组),可用的类型有
- 正常
- 唯一
- 主键
- 全文
- 空间
主键
主键有特殊处理。当您创建表时,它将创建一个复合主键,其中所有字段都使用'primary' => TRUE,当您添加具有primary_key的列时,它将删除当前主键并将新列分配为主键
脚注
大量文本来自https://guides.rubyonrails.cn/migrations.html,因为我尽量模仿了它们的功能和界面。
辅助任务
还有一些内置的任务来帮助您管理数据库
minion db:structure:dump
将一个数据库的结构复制到另一个数据库。在继续之前将要求确认。
options
- from 从config/database.php文件中加载结构的数据库id,默认为'default'
- to 从config/database.php文件中导出结构的数据库id
- force 使用此标志以跳过确认
minion db:structure:copy
将当前数据库结构导出到文件(默认为migrations/schema.sql)
- database 从config/database.php文件中导出数据库的id,默认为'default',可从config中配置
- file 覆盖schema.sql文件位置以导出到另一个文件
minion db:structure:load
将migrations/schema.sql文件中的结构加载到数据库中,在此过程中清除数据库。在继续之前将要求确认。
- database 从config/database.php文件中加载到数据库的id,默认为'default',可以从config中覆盖
- force 使用此标志以跳过确认
- file 覆盖schema.sql文件以加载另一个sql文件
minion db:test:load
将最新结构加载到测试数据库中。同时也会加载所有来自test/test_data/structure/test-schema-{type}.sql的sql文件,其中{type}基于测试数据库的类型。
minion db:recreate
删除所有表并重新运行所有迁移。在继续之前会询问确认。
options
- force: 使用此标志跳过确认
minion db:version
获取当前迁移版本
模板
您可以创建一个模板,作为生成迁移的基础。如果您想将迁移与其他模块捆绑在一起,这很有用。迁移模板只是一个包含"--- DOWN ---"行的文本文件。它上面的所有内容都放置在"up"方法中,下面的所有内容放置在"down"中。
示例
$this->add_column('users', 'facebook_uid', 'string');
$this->add_index('users', 'facebook_uid_index', 'facebook_uid');
--- DOWN ---
$this->remove_column('users', 'facebook_uid');
$this->remove_index('users', 'facebook_uid_index');
然后
./minion db:generate add_facebook_id --template=<path to template file>
完成。如果您使用--template选项,当然会忽略所有名称模式。
许可
带时间戳的迁移版权所有©2012-2017 OpenBuildings Inc. 由 Ivan Kerin 开发。它是免费软件,可以根据LICENSE文件中指定的条款重新分发。