我有我的迁移文件,它为数据库创建初始架构,我有我的种子文件,它使用随机数据和设置类型填充初始架构。
我对迁移和种子的理解是,每当有新团队成员加入时,他都可以运行它们并跟上所有数据库更改和产品工作所需的数据,此外,您可以将更改应用于 stg 和通过运行迁移文件来生产。
但是,随着我的项目的推进,新类型的数据已经出现,应用它们的唯一方法是创建一个将插入到数据库中的迁移。
我遇到的问题是工匠使用迁移和种子的方式是它首先运行所有迁移,然后运行所有种子,我似乎没有办法指定它们的顺序应该运行。所以,如果我运行migrate:refresh --seed我会出错,因为它应用了最新的迁移,它会在种子插入他自己的数据之前插入新数据(可能会也可能不会,取决于种子中插入的类型) .
我们尝试的一种解决方案是更新种子,并在应用插入数据的迁移更改之前进行检查,但这变得非常难以维护。
在这种情况下,迁移和种子的预期用途是什么?
更新 为了更清楚地说明:假设我有一个创建用户的迁移: 用户:{id,name,type} 我有我的种子来创建用户。
我运行两者,并且我有一个包含一堆用户的用户表。
时间流逝,我们决定需要一个 user_types 表。创建了一个迁移,它将创建新表,并填充新用户类型的数据并更新以匹配当前 user.type 到 user.type_id。
开发人员运行迁移,他们的数据库都是最新的。
一个新的开发者加入了团队。他负责迁移。然后是种子。它打破了。
现在,如果我们更新种子以匹配最新的,我们将遇到 user_types 表的重复数据。为了避免这种情况,我们需要在迁移中加入某种防御性代码,以便在没有数据时不运行任何东西,如果有则更新。
问题是,这是使用迁移的正确方法吗?您如何将数据更改推送给所有开发人员,而无需重新运行种子?