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

mic*_*doo 11 database symfony doctrine-orm

我使用doctrine迁移包来跟踪数据库结构中的更改.我想确保在为我的应用程序部署/添加新服务器时:

  • (A)数据库架构是最新的(学说:迁移:迁移)
  • (B)数据库始终包含预定义的数据集

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

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

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

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

Wir*_*one 5

如果您正在使用“ Doctrine迁移”,则可以使用整个数据库架构生成初始迁移,然后应该为数据库结构中进行的所有更改生成迁移(doctrine:migrations:generatedoctrine:migrations:diff),并在其中添加将迁移现有数据的查询。

夹具用于预先填充数据(带有doctrine:fixtures:load),我认为,夹具应该保持最新的数据库模式,并在doctrine:migrations:migrate/ 之后执行doctrine:schema:create

所以最后:

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

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

注意:现有实例不应使用doctrine:schema:update,而只能使用doctrine:migrations:migrate。在我们的应用程序中,我们甚至在以下位置阻止使用此命令app/console

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();
}
Run Code Online (Sandbox Code Playgroud)

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