如何为数据库(特别是Symfony)存储所需的“基础”或“初始”数据?

时间:2015-08-07 19:01:30

标签: database symfony doctrine-orm

我使用doctrine migrations包来跟踪数据库结构的变化。我想确保在为我的应用程序部署/添加新服务器时:

  • (A)数据库架构是最新的(doctrine:migrations:migrate)
  • (B)数据库始终包含预定义的数据集

对于(B)一个很好的例子是角色。我希望始终存在一组特定的角色。我意识到数据库迁移是可能的,但我不喜欢将模式更改与数据更改混合在一起的想法。此外,如果我使用MySql迁移,我将不得不为我的测试数据库创建一个等效的Sqlite迁移。

我知道的另一个选择是数据夹具。然而,通过阅读文档,我感觉夹具更适合加载测试数据。此外,如果我更改了角色名称,我不知道如何使用fixture更新它(因为它们要么在加载或追加之前删除数据库中的所有数据)。如果我使用append,那么唯一键也是一个问题。

我正在考虑创建某种带有一组配置文件的命令,并确保某些表始终处于与配置文件匹配的一致状态 - 但如果存在其他选项,我当然希望使用它。

处理将所需数据加载到数据库中的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

如果您正在使用Doctrine Migrations,您可以使用整个数据库架构生成初始迁移,那么您应该为数据库结构中所做的所有更改生成迁移(doctrine:migrations:generatedoctrine:migrations:diff)并且还添加了将迁移现有数据的查询。

Fixtures旨在预先填充数据(doctrine:fixtures:load),在我看来,它们应与最新数据库架构保持同步,并在{{{{{ 1}} / doctrine:migrations:migrate

最后:

  • 使用初始数据库架构创建基本迁移(而不是执行doctrine:schema:create只生成迁移文件并进行迁移)
  • 为每个数据库架构更改创建新的迁移以及迁移现有数据(例如更改角色名称)
  • 使用最新架构使灯具保持最新(您可以使用doctrine:schema:create选项,只更新灯具而不是先删除所有数据库数据)

然后,在部署新实例时,您可以运行--append,然后doctrine:schema:create(将所有迁移标记为已迁移,因为您已创建了最新架构)和doctrine:migrations:version --add --all --no-interaction将填充数据到数据库(也是最新版本,因此不需要从Doctrine迁移文件迁移数据)。

注意:现有实例不应使用doctrine:fixtures:load,而应仅使用doctrine:schema:update。在我们的应用中,我们甚至在doctrine:migrations:migrate

中阻止使用此命令
app/console

这是我从经验中得出的结果。希望你会发现它很有用: - )