2017-07-17 2 views
0

Je développe une application RoR en utilisant une base de données PostgreSQL, la base de cette définition database.yml:Râteau comportement incohérent entre dev et test?

# PostGre databases 

    default: &default 
     host : localhost 
     adapter: postgresql 
     encoding: unicode 
     pool: 5 
     username: keyman 
     password: keymanApp 
     schema_search_path: "keyman" 

    development: 
     <<: *default 
     database: keyman_dev 

    test: 
     <<: *default 
     database: keyman_test 

J'ai créé une petite routine Rake, donc je peux facilement tomber et créer ma base de données de postgreSQL, y compris le schéma que je travaille avec:

 namespace :db do 
      desc 'Create database schemas before going for the first migration' 
      task init: ['db:drop','db:create'] do 
      ActiveRecord::Base.connection.execute("CREATE SCHEMA keyman AUTHORIZATION keyman") 
      puts 'Database initialised' 
      end 
      end 

Quand je lance rake db: init, il est exécuté à la fois sur les environnements de dev et de test:

$ rake db:init 
Dropped database 'keyman_dev' 
Dropped database 'keyman_test' 
Created database 'keyman_dev' 
Created database 'keyman_test' 
Database initialised 

Mais le résultat n'est pas le même: le schéma 'keyman' est créé pour la base de données keyman_dev, mais pas pour la base de données keyman_test.

Je dois exécuter explicitement rake db: init RAILS_ENV = test pour obtenir le schéma créé sur la base de données de test.

Cela me semble étrange! Avez-vous une explication? Merci

Répondre

2

lors de l'exécution bin/rake -T db nous pouvons voir les descriptions suivantes pour db:create et db:drop

rake db:create    # Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to creating the development and test databases 
rake db:drop    # Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to dropping the development and test databases 

Ainsi, lorsque vous exécutez ces tâches dans l'environnement de développement, ils ont tous deux faire les bases de données development et test, mais doesn Cela signifie que d'autres tâches (telles que votre tâche personnalisée) s'exécutent automatiquement dans les deux environnements, votre tâche est toujours exécutée uniquement dans l'environnement development.

Dans cette tâche de rake, , doit exécuter cette requête dans les deux tables, bien que cette tâche n'ait pas été testée.

environments = Rails.env.development? ? [:development, :test] : [Rails.env.to_sym] 

environments.each do |env| 
    ActiveRecord::Base.establish_connection(env) 
    # do something 
end 
+0

Merci pour cette explication très claire, je ferai attention à cela dans mes futures tâches de ratissage. – user1185081