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

时间:2012-11-28 13:07:29

标签: php database yii migration laravel

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

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

手工创建:

  • 永远采取
  • 非常容易出错。

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

9 个答案:

答案 0 :(得分:25)

在Yii中完成此任务的说明:

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

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

  3. this gist的内容复制到protected/commands/InitialDbMigrationCommand.php

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

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

答案 1 :(得分:4)

' Doctrine Project' (aka Doctrine)能够为现有数据库结构创建数据库迁移,因此您可以重新创建现有结构。它可以在Symfony,Laravel,Yii和许多框架中轻松实现。

样本来自: http://symfony.com/legacy/doc/doctrine/1_2/en/07-Migrations

  

来自数据库

     

如果您有现有数据库,则可以构建一组迁移   将通过运行以下命令重新创建数据库的类   命令。

$ ./symfony doctrine:generate-migrations-db
     

来自模特

     

如果您有一组现有模型,则可以构建一组迁移   将通过运行以下命令来创建数据库的类   命令。

$ ./symfony doctrine:generate-migrations-models

答案 2 :(得分:1)

好了,因为迁移是关于设置数据库结构并对其进行更改,而不是反映当前数据库没有这种方式。

这也不是你必须做的一步。您可以从目前所处的位置开始,这将使您能够回滚到这一点。这意味着您可以为当前表进行迁移,而无需指定其整个结构,只需指定更改。

假设您有一个名为user的表,并希望将其名字添加到其中。

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

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

答案 3 :(得分:1)

这是我创建的Laravel包,它正是这样做的。它可以从现有数据库自动生成干净准确的Laravel迁移。

由于它没有对数据库做任何假设,它应该适用于任何数据库结构,同时保留原始索引和外键名称。

https://github.com/Xethron/migrations-generator

答案 4 :(得分:1)

至于Yii 1.x, schmunk 创造了一个精彩的database-command yiic命令。

此命令仅涵盖迁移。您必须编写自己的向下迁移

使用它:

  1. 获取the newest version from GitHub并将其内容放入/protected/commands文件夹(创建一个,如果它不存在)。请注意,您需要将内容without subfolder放置此特定命令),这与我们对扩展的示例相反。

  2. 如果要使用EDatabaseCommand.php命令(如文档中所示),请将DatabaseCommand.php文件(和内部类)重命名为yiic database。如果没有此修复程序,您将必须使用yiic edatabase命令,there's slight inconsistency between docs and the code(至少在最新版本中,编写此内容时;可能 schmunk 将修复此问题)。

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

  4. 这将在文件名的开头创建一个具有正确日期和时间的迁移protected/runtime/migration_name.php文件,并填充一系列CDbMigration命令以重新创建数据库模式。访问文档中的“Usage”部分,了解有关自定义命令的更多信息。

答案 5 :(得分:0)

我同时使用Yii和Laravel,但我找不到你需要的东西。它们都创建空文件,您需要自己创建迁移脚本。 对于150个表的表,自己创建迁移将是一个挑战,但它并不像您想象的那么难。因为您已经掌握了有关字段的信息,所以创建它们不需要这么长时间。

答案 6 :(得分:0)

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

(至少版本4,谁知道这将有多长时间,Laravel变化太快,并且有太多重大变化)

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

再次,如果你喜欢在MySQL Workbench之类的东西中构建你的模式,超级超级有用。我还看到了一个解析工作台文件的软件包...但链接已经死了。

您可能还希望将此拉里包用于:https://github.com/JeffreyWay/Laravel-4-Generators

然后,您可以创建一个CakePHP样式的脚手架。

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

答案 7 :(得分: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

我已经从头开始创建它,因为我不得不手动执行此操作以便将其分发给我的团队。

希望它有所帮助!

随意分享错误,改进和评论。

答案 8 :(得分:0)

我认为Yii2的答案是:https://github.com/jamband/yii2-schemadump "此命令用于从现有数据库生成模式。"