测试数据库模式不同于生产数据库(原则:模式:创建)

Test DB schema different than production DB (doctrine:schema:create)

我正在为单元测试设置测试环境,Symfony's Test-Guide。 然而,每次我部署测试数据库时,最终的 table 看起来与生产数据库中的原始 略有不同。

也就是说


我使用迁移文件来构建生产数据库。 也许我在生产数据库设置方面以错误的顺序进行了测试数据库设置?

这就是我正在做的事情:

Step Action Command
1 Remove all databases mysql -e "DROP DATABASE prod_db" //...
2 Add production db mysql -e "CREATE DATABASE prod_db"
3 Execute migrations for production db php bin/console doctrine:migrations:migrate
4 Add test-db php bin/console --env=test doctrine:database:create
5 Create test-db schema php bin/console --env=test doctrine:schema:create

问:造成差异的原因是什么?

最简单的答案是模式确实不同:虽然 doctrine:schema:create 针对您的实体即时生成所需的 DDL,但 doctrine:migrations:migrate 执行一系列 SQL 您(可能借助 make:migration 命令)先前定义的句子。

对您的实体做一个小改动而忘记创建相应的迁移是很容易的。

要检查生产中有什么不同(您忘记添加到迁移中的内容)您可以:

  • 使用 bin/console make:migration 创建新迁移。这将创建一个包含缺失句子的新迁移。
  • 只需检查 bin/console doctrine:schema:update --dump-sql 的变化。

TL;DR 要使您的测试数据库与生产数据库相匹配,请使用以下命令代替您的第 5 个命令:

bin/console doctrine:migrations:migrate -e test

这将加载相同的 SQL,使它们匹配。

好处:您还可以使用 symfony 命令截断您的数据库:如果您更改数据库引擎,学说会处理它(添加 -e 根据需要标记):

bin/console doctrine:database:drop --force && bin/console doctrine:database:create