运行一个特定的 Laravel 迁移(单个文件)
在Laravel中运行特定的迁移(单个文件)
在Laravel中,迁移是按照它们创建的确切顺序逐个执行的,以便可以跟踪执行和执行顺序。这样,Laravel就能够安全地回滚一批迁移,而不会破坏数据库。
如果允许用户手动执行迁移,就无法确切知道如何回滚对数据库的更改。
如果您确实需要在数据库中执行某些操作,最好创建一个DDL脚本并手动在Web服务器上执行它,或者只需创建一个新的迁移并使用Artisan执行它。
如果您需要首先执行迁移,您需要先创建它。迁移是带有时间戳的名称创建的:
2013_01_20_221554_table
要在此之前创建一个新的迁移,您可以将其命名为:
2013_01_19_221554_myFirstMigration
是的,您说得很清楚,但在您的评论结尾处,我看到:“或者只需创建一个新的迁移并使用Artisan执行它。”我创建了一个新的迁移,我想要运行它。如果我运行artisan migrate,此命令将运行我所有的迁移,而不是我创建的新迁移。
如果您需要首先运行它,您需要先创建它。迁移是带有名称时间戳的创建的(2013_01_20_221554_table),只需将您的迁移重命名为第一个即可。
我不是想重新排序我的迁移。我在项目开始时创建了五个迁移。几周后,我发现需要一个新的表,所以我创建了一个新的迁移。我想运行它以添加新的表和其结构。我不明白为什么我应该重新运行已经执行过的迁移,而不只是运行我创建的新迁移?
正如我所说,Laravel会跟踪您的迁移,如果它重新运行任何迁移,那是因为在它上面执行了回滚(或重置),或者迁移表出现了问题。
如果您迁移了数据库,然后添加了新的迁移,只需再次运行Artisan migrate命令即可。它将按照创建顺序迁移所有未迁移的迁移。
Laravel是如何跟踪已经执行的迁移的?它将其存储在数据库中的一个迁移表中吗?
是的,准确地说,有一个用于此目的的迁移文件。
无论如何,我认为运行特定的迁移可能会很有用,特别是如果迁移包括多个相关的表(具有外键和中间表),在这种情况下,您需要按正确顺序删除表。我会创建基本迁移,如catalog_layer、office_layer等,其中包含单个应用功能所需的所有表,然后根据需要添加改进某些表/层的迁移。也许这是错误的方法,但某个功能的所有层内容都在单个文件中,并具有适当的删除顺序,在不断更改和重置(测试/改进/更改)时非常有用。
我同意-在开发过程中,我希望我的迁移是完全正确的。所以当我在生产环境中运行它们时,它们能够无缺地工作。有时(在开发过程中)我回滚到初始状态-更改一个迁移然后重新开始。但是当我迁移时,它会迁移所有的迁移-我宁愿有一个选项来逐个迁移,依然按顺序逐个迁移,这样我就能逐个回滚。
因为“看起来你做错了”。依我看来,Laravel做错了。开发和生产是两个不同的环境,它们需要不同类型的保证和安全措施,如果它们遵循不同的规则,那是完全合理的。开发需要最大的灵活性,而且开发人员可能需要根据自己的需求调整迁移机制。我自己非常缺乏这种灵活性,因此不得不进行直接的数据库操作以实现我想要的结果,在生产环境中这是绝对不会发生的,但在开发过程中经常发生。
我不同意您的观点,因为Laravel没有做错任何事情。规则是“永远不要编辑在生产中执行的迁移”。但是,您可以以任何您认为合适的方式编辑本地迁移。
也许我在这里漏掉了些什么,但是在测试中,执行单个迁移可能非常有用。如果您想在大型迁移之后运行一些测试,那么您很可能首先需要在测试数据库中创建一些表和其他内容,以便您可以填充它。然后,您希望运行您的大型迁移,并确保在测试中一切正常。据我所知,这需要一些在Laravel中的hacky方法,例如将迁移移入和移出迁移目录,或者使用棘手的--path选项。
无论如何重命名文件,手动创建迁移文件对我来说都不起作用。但是,当我通过php artisan make:migration命令创建迁移时,它起作用了。我正在运行Laravel 5.7。