-1

I am setting up a test environment for unit tests, following Symfony's Test-Guide. However each time I deploy the test-DB the final tables look slightly different than the originals from the production db.

That means

  • some columns appear on another position in table
  • some indexes/keys are missing or added
  • some indexes/keys copied from prod-db are unique in test-db but the originals are not

I use migration files to build up the production-db. Maybe I am doing the test-db setup in wrong order regarding the production db setup?

This is what I am doing:

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

Q: What is the cause of the differences?

Jonathan
  • 1,955
  • 5
  • 30
  • 50
  • You are right! **Instead** of `doctrine:schema:create` I must do a `doctrine:migrations:migrate`! Now each databases look exactly the same. Thanks a lot. Want to put this as a full answer? – Jonathan Feb 10 '22 at 07:27

1 Answers1

1

The simplest answer is that the schemas do, in fact, differ: While doctrine:schema:create generates the required DDL on the fly against your entities, the doctrine:migrations:migrate executes a series of SQL sentences that you (probably with the help of the make:migration command) previously defined.

It's all to easy to do a small change to your entities and forget to create the corresponding migration.

To check what's different in production (i.e. what you forgot to add to the migrations) you can either:

  • Create a new migration with bin/console make:migration. This will create a new migration with the missing sentences.
  • Just inspect the changes with bin/console doctrine:schema:update --dump-sql.

TL;DR To just make your test database match the production one, use the following command in place of your 5th command:

bin/console doctrine:migrations:migrate -e test

This will load the same SQL, making them match.

Bonus: you can also truncate your databases using symfony commands: in the event that you change your database engine, doctrine will take care of it (add the -e flag as needed):

bin/console doctrine:database:drop --force && bin/console doctrine:database:create
msg
  • 7,863
  • 3
  • 14
  • 33