测试数据库模式不同于生产数据库(原则:模式:创建)
Test DB schema different than production DB (doctrine:schema:create)
我正在为单元测试设置测试环境,Symfony's Test-Guide。
然而,每次我部署测试数据库时,最终的 table 看起来与生产数据库中的原始 略有不同。
也就是说
- 某些列出现在 table
中的另一个位置
- 缺少或添加了一些 indexes/keys
- 从 prod-db 复制的一些 indexes/keys 在 test-db 中是唯一的,但原件不是
我使用迁移文件来构建生产数据库。
也许我在生产数据库设置方面以错误的顺序进行了测试数据库设置?
这就是我正在做的事情:
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
我正在为单元测试设置测试环境,Symfony's Test-Guide。 然而,每次我部署测试数据库时,最终的 table 看起来与生产数据库中的原始 略有不同。
也就是说
- 某些列出现在 table 中的另一个位置
- 缺少或添加了一些 indexes/keys
- 从 prod-db 复制的一些 indexes/keys 在 test-db 中是唯一的,但原件不是
我使用迁移文件来构建生产数据库。 也许我在生产数据库设置方面以错误的顺序进行了测试数据库设置?
这就是我正在做的事情:
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