2017-07-17 2 views
0

Ich entwickle eine RoR Anwendung einer PostgreSQL-Datenbank, basierend auf dieser database.yml Definition:Rake uneinheitliches Verhalten zwischen Entwickler und 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 

ich eine kleine Rake Routine erstellt, so kann ich meine PostgreSQL-Datenbank, einschließlich dem Schema arbeite ich einfach fallen lassen und erstellen mit:

 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 

Wenn ich rake db laufen: init wird sowohl auf dev und Testumgebungen ausgeführt:

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

Aber Das Ergebnis ist nicht das gleiche: Das Schema 'keyman' wird für die Datenbank keyman_dev erstellt, nicht jedoch für die Datenbank keyman_test.

Ich muss explizit Rake ausführen db: init RAILS_ENV = Test, um das Schema in der Test-Datenbank erstellt zu bekommen.

Es klingt seltsam für mich! Hast du eine Erklärung? Dank

Antwort

2

wenn bin/rake -T db ausgeführt wird, können wir die folgenden Beschreibungen für db:create und 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 

So sehen, wenn Sie diese Aufgaben in der Entwicklungsumgebung ausführen, sie beide tun, um die development und test Datenbanken, aber das doesn Es bedeutet, dass andere Aufgaben (z. B. Ihre benutzerdefinierte Aufgabe) automatisch in beiden Umgebungen ausgeführt werden. Ihre Aufgabe wird weiterhin nur in der Umgebung development ausgeführt.

So etwas in Ihrer Rake-Aufgabe sollte erhalten diese Abfrage in beiden Tabellen ausgeführt werden, obwohl dies nicht getestet ist.

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

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

Vielen Dank für diese sehr klare Erklärung, ich werde darauf in meinen zukünftigen Rake-Aufgaben achten. – user1185081

Verwandte Themen