在Yii或Laravel中从现有数据库生成迁移

16

我正在开发一个相当复杂的数据库(150多个表)项目。为了能够维护变更,我决定添加迁移,最好使用 Yii 或 Laravel。

有人知道是否可能从现有数据库生成初始迁移吗?

手动创建会:

  • 耗费很长时间
  • 非常容易出错。

如果没有办法,有人知道一个良好的基于PHP的框架,支持这样的功能吗?


没有自动化的方法可以将现有的数据库转换为Laravel表。 - afarazit
9个回答

25

在 Yii 中完成此操作的步骤:

  1. 将您的数据库连接设置添加到 protected/config/console.php 文件中。

  2. 运行 yiic migrate create initial 命令创建迁移的存根代码。

  3. 此清单的内容复制到 protected/commands/InitialDbMigrationCommand.php 文件中。

  4. 运行 yiic initialdbmigration 'name_of_your_database' > initial_migration.php 生成用于初始数据库迁移的 up()down() 方法。

  5. 从步骤 2 创建的文件中复制并粘贴 up()down() 方法到 protected/migrations 文件夹中。


7
你的回答引发了我们关于元问题的有趣讨论。结论是,如果你能在这个答案下面包含来自你的gist的整段代码的话,你的回答将会更完美(请编辑并添加这段代码)。我曾经试图这样做,但是不得不移除我的更改,因为我被警告说我正在侵犯版权,只有你(gist作者)可以将这段代码添加到你自己的回答中。你愿意考虑添加它吗? - trejder

4
'Doctrine Project'(又名Doctrine)具有为现有数据库结构创建数据库迁移的功能,因此您可以重新创建现有结构。它可以轻松地在Symfony、Laravel中实现,也可以在Yii和许多框架中使用。
示例来源:
http://symfony.com/legacy/doc/doctrine/1_2/en/07-Migrations

From Database

If you have an existing database you can build a set of migration classes that will re-create your database by running the following command.

$ ./symfony doctrine:generate-migrations-db

From Models

If you have an existing set of models you can build a set of migration classes that will create your database by running the following command.

$ ./symfony doctrine:generate-migrations-models

2
这里有一个我创建的 Laravel 包,可以自动生成干净准确的 Laravel 迁移文件,基于现有数据库。由于不对数据库做任何假设,所以它应该适用于任何数据库结构,甚至保留原始索引和外键名称。详情请查看 https://github.com/Xethron/migrations-generator

1

由于迁移是关于设置数据库结构并对其进行更改,而不是反映当前数据库的方式,因此没有这样的方法。

这也不是必须要执行的步骤。您可以从当前位置开始,这将使您能够回滚到此点。这意味着您可以为当前表制作迁移,而无需指定它们的整个结构,只需指定更改即可。

假设您有一个名为“用户”的表,并想向其中添加他们的名字。

php artisan migrate:make add_firstname_to_user

现在进入application/migrations目录,找到迁移文件,添加以下内容

public function up()
{
    Schema::table('user', function($table)
    {
        $table->string('firstname');
    });
}

public function down() {
    Schema::table('user', function($table)
    {
        $table->drop_column('firstname');
    });
}

现在您可以添加迁移

php artisan migrate:install // if you haven't run this, should only be once
php artisan migrate

使用回滚功能

php artisan migrate:rollback

这将添加或删除列firstname,而不以任何其他方式影响您的表。


1
无论如何,拥有这样的功能都是很好的,可以为已经具有完整数据库结构的新项目生成初始迁移脚本。例如:您可能正在从另一个平台进行迁移,或者自上次迁移脚本以来数据库已更改,或者您以前没有使用过迁移脚本,希望开始为现有项目使用它们。总会有特殊情况,而它们并不总是那么特殊... - DarkWingDuck
1
这将非常不错...其他框架(如CakePHP)也这样做,原因是在诸如MySQL Workbench等工具中构建模式要容易得多。但是,如果您计划更改数据库(因此它是不可知的),则在PHP中构建模式要容易得多。有这个包:https://github.com/JeffreyWay/Laravel-4-Generators...它使事情变得更加美好(为Laravel添加了一些类似于CakePHP的功能)。 - Tom
导出模式并在像MySQL Workbench这样的工具中加载此脚本,在设置新环境时(甚至在第一次迁移中)使用,有什么问题呢?之后再开始使用迁移。 - Sisko78

1
关于Yii 1.x,schmunk创建了一个出色的database-command yiic命令。 此命令仅涵盖向上迁移。您必须编写自己的向下迁移。 使用方法如下:
  1. 从GitHub获取最新版本,并将其内容放入/protected/commands文件夹中(如果不存在,请创建一个)。请注意,您需要将内容原样放置在此特定命令的无子文件夹中,这与我们为扩展程序所做的相反。

  2. 如果要使用yiic database命令(如建议中所述),请重命名EDatabaseCommand.php文件(和类内部)为DatabaseCommand.php。如果没有进行此修复,则必须使用yiic edatabase命令,因为文档和代码之间存在轻微的不一致性(至少在编写本文时是最新版本;也许schmunk会修复这个问题)。

  3. 有了这个,回到控制台中的protected文件夹,并执行yiic database dump migration_name --prefix=table_name

这将创建一个迁移protected/runtime/migration_name.php文件,文件名开头会带有正确的日期和时间,并填充一系列CDbMigration命令以重新创建数据库架构。请访问文档中的“使用说明”部分了解更多自定义命令信息。

1

据我所了解,在SO上,仅包含链接的答案因为链接失效而不被看好。 - tumultous_rooster

0
我同时使用 Yii 和 Laravel,但我都没找到你所需的功能。它们都只会创建空文件,你还需要自己编写迁移脚本。 对于一个包含150个表的数据库来说,自己编写迁移脚本确实是个挑战,但并不像你想象的那样困难。因为你已经有了字段信息,所以创建起来应该不会太费时。

我在Yii中编写了一个名为mysqlf的脚本,可以从现有数据库生成迁移。 - DamirDiz
2
请分享一下吧 :),我很想看看。尤其是在 Yii 中。 - Mihai P.

0

现在Yii有一个:

这允许分布式团队轻松地在本地更新数据库,然后通过版本控制系统(我使用git)自动将其更新与其他开发人员一起分发到代码的其余部分。它还执行完整的初始数据库转储到xml和迁移文件。

项目主页: https://code.google.com/p/yii-automatically-generated-migration-files/

源代码: https://code.google.com/p/yii-automatically-generated-migration-files/source/checkout

我从头开始创建它,因为我很烦恼必须手动完成这项工作才能将其分发给我的团队。

希望它有所帮助!

欢迎分享错误、改进和评论。


0

经过一些研究,这是你需要使用 Laravel 的东西:https://github.com/XCMer/larry-four-generator

(至少是第4版,谁知道这会持续多久,Laravel 变化太快,有太多的重大变化)

你需要运行 php artisan larry:fromdb,它会显示表格...你也可以排除或只处理某些表格(查看自述文件)。

如果你喜欢在 MySQL Workbench 等工具中构建模式,那么这个工具非常非常有用。我还看到提到一个可以解析 Workbench 文件的包...但链接已失效。

你可能还希望使用这个 larry 包与 https://github.com/JeffreyWay/Laravel-4-Generators 一起使用。

然后你可以像 CakePHP 那样创建脚手架。

或者,尝试这个包:https://github.com/barryvdh/laravel-migration-generator


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接