2011-10-07 17 views
65

Dovrai ammettere che, per un principiante di rail e database, la spiegazione ufficiale su rubyonrails.org fa sì che tutte e quattro queste attività suonino esattamente allo stesso modo. Codice:Qual è la differenza tra db: test: clone, db: test: clone_structure, db: test: load e db: test: preparare?

rake db:test:clone Recreate the test database from 
        the current environment’s database schema 

rake db:test:clone_structure Recreate the test database from the 
           development structure 

rake db:test:load Recreate the test database from the current schema.rb 

rake db:test:prepare Check for pending migrations and load the test schema 

Non so nemmeno la differenza tra struttura e schema. E qual è la differenza tra il caricamento dello schema dell'ambiente corrente e il caricamento dello schema.rb?

Quanto simili (o diversi) sono questi compiti?

risposta

61

Ottima domanda. mi aveva sconcertato così mi sono tuffato nella fonte rotaie e tirato su database.rake. Ora è più chiaro:

db:test:clone è solo una combinazione di db:schema:dump e db:test:load:

task :clone => %w(db:schema:dump db:test:load) 

db:test:clone_structure utilizza il {} RAILS_ENV file di _structure.sql:

task :clone_structure => [ 'db:structure:dump', 'db:test:purge' ] do 
    # skipped some code, here's what happens for MySQL: 
    ActiveRecord::Base.establish_connection(:test) 
    # ... 
    IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split("\n\n").each do |table| 
    ActiveRecord::Base.connection.execute(table) 
    end 
end 

db:test:load è lo stesso di db:schema:load , ma invoca il database di test:

task :load => 'db:test:purge' do 
    ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test']) 
    # ... 
    db_namespace['schema:load'].invoke 
end 

segnala eventuali migrazioni in sospeso e, in caso contrario, esegue db:test:clone_structure (utilizzando il file {rails_env} _structure.sql) o db:test:load (utilizzando il file schema.rb), a seconda del formato dello schema (questo è un un po 'di confusione per me, forse qualcun altro può espanderci sopra:

task :prepare => 'db:abort_if_pending_migrations' do 
    # ... 
    db_namespace[{ :sql => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke 
end 

Spero che questo chiarisca tutto! Anche in questo caso, passando attraverso il file database.rake è facile e sarà chiarire tutte le altre domande che potreste avere. Quel collegamento va alla riga che è l'inizio di: test namespace.

+0

Bottom line: Sono tutti praticamente la stessa cosa. :-p – bricker

+0

warning - Ho trovato che db: test: clone non ha copiato correttamente il nullability delle colonne dal mio database di sviluppo. Questo potrebbe essere un vecchio bug che è stato successivamente corretto, poiché l'ho trovato usando Rails 2.3.12. –

20

In realtà non sono esattamente la stessa cosa. Qualsiasi di quelle attività che contengono la parola "schema" agisce sul file .../db/schema.rb. schema.rb è effettivamente lo stato del tuo schema dopo aver applicato tutte le migrazioni. Può essere eseguito per ripristinare lo schema piuttosto che eseguire tutte le migrazioni di db (che può richiedere molto tempo se si hanno molte migrazioni).

Qualsiasi attività con la parola "struttura", agisce sul file {Rails.env} _structure.sql. Questo file viene utilizzato quando lo schema contiene costrutti che non possono essere espressi nel file schema.rb. Ad esempio, se si utilizzano funzionalità specifiche per un particolare RDBMS. Sotto le copertine, le rotaie producono questo file usando qualunque schema di dump utility appropriato per il tuo RDBMS. Per ripristinare lo schema, si legge il file in ed esegue le istruzioni SQL agains utilizzando uno strumento specifico per RDBMS.

Rails sa se andare via o schema.rb il percorso structure.sql basata sulla necessità o meno che hai impostato

config.active_record.schema_format =: sql

nel vostro ... /config/application.rb

+1

Eccellente espansione sulla risposta di Bricker sopra - grazie! –

+0

esempi di cose che possono essere diverse: trigger, funzioni e stored procedure. (che è il motivo per cui siamo ancora bloccati con la struttura). –

Problemi correlati