openbuildings/timestamped-migrations

此包已被废弃,不再维护。未建议替代包。

迁移是一种方便的方式,让您以结构化和组织化的方式更改数据库

安装: 33,448

依赖项: 0

建议者: 0

安全: 0

星标: 22

关注者: 19

分支: 10

开放问题: 3

类型:kohana-module

0.3.1 2017-11-14 22:58 UTC

This package is not auto-updated.

Last update: 2020-01-24 15:17:29 UTC


README

Build Status Scrutinizer Quality Score Code Coverage Latest Stable Version

迁移是一种方便的方式,让您以结构化和组织化的方式更改数据库。您可以手动编辑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:updb:migrate:down命令。只需指定相应的版本,相应的迁移将调用其上或下方法,例如

./minion db:migrate:up --version=1321025460

将运行1321025460迁移的上方法。这些命令会检查迁移是否已运行,例如,如果迁移模块认为已经运行了--version=1321025460,则db:migrate:up --version=1321025460将不会执行任何操作。

迁移最后几步

默认情况下,db:migrate:updb:migrate:downdb: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 - 对decimalfloat有效
  • 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文件中指定的条款重新分发。