2014-03-25 77 views
1

我即将开始为现有应用程序构建API,并且该数据库已在生产中。功能将在未来逐渐移植到API中,应用程序将变得更加“以API为中心”。在Laravel 4中为现有数据库创建迁移

其中一个主要的出发点是采用迁移和构建过程。对于在现有模式下创建迁移而不会在执行时破坏生产的最佳方式,我有所保留。

因为我们希望快速地将功能移植到API中,所以我们理想地想要将我们当前的模式作为构建过程的一部分重新创建并获得一些核心单元测试 - 而不仅仅是为将来创建迁移变化。

这是我对最好的开始地点不确定的地方。

这样的任务的最佳方法是什么?

  1. 可以导入当前模式作为我们的第一次迁移吗?
  2. 难道这最初的迁移被包裹在这样的: if (App::environment() !== 'production'),以确保它不会在生产环境中执行?
  3. 可以排除特定环境的迁移或可能导致问题吗?

有可能太简单我缺少的另一种方法还是什么? :)

回答

1

我不建议在运行生产环境迁移可言,但如果你必须再进行数据库的备份副本,并在本地创建数据库的副本,并进行迁移有再测试,使确定它一切正常。

  1. 您可以创建第一个迁移并手动添加所有架构布局。但我实际上会在几次迁移中做到这一点,让每个表都作为自己的迁移。
  2. 由于迁移从CLI使用工匠运行,你可以通过你想要的迁移要对运行环境和数据库:

    工匠迁移--database =“则connectionName” --env =“本地”

  3. 有运行在一个特定的环境迁移没有问题,除了我上面所说的生产规定。

记得从步骤1(迁移文件名不包括扩展名,比如2014_03_25_143340_AddCountriesTable),以在数据库中迁移表,在步骤2,否则运行以下命令将引发约表错误已经存在添加的所有现有架构布局。

希望这会有所帮助。

+0

是否有任何理由,你不会跑在生产迁移?我想使用迁移之中的保护的理由是为了防止它在生产环境中运行 - 柜面有人不小心“迁移下来”和丢弃的所有表。 – acairns

+0

我有些喜欢做这个手工根据不同的项目,因为我的,而不是被他们的自动化控制的变化。但这只是个人喜好。 –

3

我不久前创建了一个工具,它将生成当前数据库模式的所有迁移。它还将新创建的迁移添加到迁移表中,因为这些表已经存在。你可以在这里得到它:https://github.com/Xethron/migrations-generator

其次,我用下面的代码行中我DatabaseSeeder,但你可以把它添加到你希望在生产中禁用任何函数:

if (App::environment() === 'production') { 
    exit('Don\'t be stupid, this is a production server!!!'); 
} 

它不应该如果你通过抛出一个错误或者如上所述来停止执行,那么这就成了一个问题。如果您不这样做,Laravel会认为这些更改已成功发生并将其从迁移表中删除,并在运行迁移时导致错误。唯一的例外是,如果你同时排除向上和向下代码(但是我不明白为什么你会想这样做)

希望这有助于。

相关问题