Database 如何存储所需的';基数';或';首字母';数据库的数据(尤其是Symfony)?

Database 如何存储所需的';基数';或';首字母';数据库的数据(尤其是Symfony)?,database,symfony,doctrine-orm,Database,Symfony,Doctrine Orm,我使用doctrine migrations捆绑包来跟踪数据库结构中的更改。我希望在为我的应用程序部署/添加新服务器时确保: (A) 数据库架构是最新的(条令:迁移:迁移) (B) 数据库始终包含一组预定义的数据 对于(B)项,一个很好的例子是角色。我希望有一组角色始终存在。我意识到数据库迁移是可能的,但我不喜欢将模式更改与数据更改混合在一起的想法。另外,如果我使用MySql迁移,我必须为我的测试数据库创建一个等效的Sqlite迁移 我知道的另一个选择是数据装置。然而,通过阅读文档,我感觉夹

我使用doctrine migrations捆绑包来跟踪数据库结构中的更改。我希望在为我的应用程序部署/添加新服务器时确保:

  • (A) 数据库架构是最新的(条令:迁移:迁移)
  • (B) 数据库始终包含一组预定义的数据
对于(B)项,一个很好的例子是角色。我希望有一组角色始终存在。我意识到数据库迁移是可能的,但我不喜欢将模式更改与数据更改混合在一起的想法。另外,如果我使用MySql迁移,我必须为我的测试数据库创建一个等效的Sqlite迁移

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

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


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

如果使用条令迁移,您可以使用整个数据库架构生成初始迁移,然后您应该生成迁移(
条令:迁移:生成
条令:迁移:差异
)对于在数据库结构中所做的所有更改,并添加将迁移现有数据的查询

fixture被设计为预先填充数据(使用
原则:fixture:load
),在我看来,它们应该使用最新的数据库模式保持最新,并在
原则:迁移:迁移
/
原则:模式:创建
之后执行

因此,最后:

  • 使用初始数据库模式创建基本迁移(而不是执行
    doctor:schema:Create
    只需生成迁移文件并迁移它)
  • 为每个数据库架构更改和迁移现有数据(如角色名称更改)创建新迁移
  • 使fixture与最新架构保持最新(您可以使用
    --append
    选项,只更新fixture,而不是首先删除所有数据库数据)
然后,在部署新实例时,您可以运行
原则:模式:创建
,然后运行
原则:迁移:版本--添加--全部--无交互
(将所有迁移标记为迁移,因为您已经创建了最新的模式)和
原则:装置:加载
,这将向数据库填充数据(也是最新版本,因此不需要从条令迁移文件进行数据迁移)

注意:现有实例不应使用
原则:架构:更新
,而应仅使用
原则:迁移:迁移
。在我们的应用程序中,我们甚至在
应用程序/控制台
中阻止使用此命令:

use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Helper\FormatterHelper;

// Deny using doctrine:schema:update command
if(in_array(trim($input->getFirstArgument()), ['doctrine:schema:update'])) {
    $formatter = new FormatterHelper();
    $output = new ConsoleOutput(ConsoleOutput::VERBOSITY_NORMAL, true);

    $formattedBlock = $formatter->formatBlock(['[[ WARNING! ]]', 'You should not use this command! Use doctrine:migrations:migrate instead!'], 'error', true);

    $output->writeln($formattedBlock);
    die();
}

这是我根据自己的经验得出的结论。希望你会发现它有用:-)

因为这里有一些投票,也许有人会对我为解决这个问题而发出的命令感兴趣。。虽然它还没有经过测试,也不可能接近生产,但它可能是一个开始