Het verschil tussen rake db:migrate
en rake db:reset
is vrij duidelijk in mijn hoofd. Wat ik niet begrijp, is hoe rake db:schema:load
verschilt van de vorige twee.
Voor de zekerheid dat ik op dezelfde lijn zit:
rake db:migrate
– Voert de migraties uit die nog niet zijn uitgevoerd.rake db:reset
– Wist de database (vermoedelijk doet eenrake db:drop
+rake db:create
+rake db:migrate
) en voert de migratie uit op een nieuwe database.
Help me alsjeblieft te verduidelijken, als ik het verkeerd heb begrepen.
Antwoord 1, autoriteit 100%
-
db:migratevoert (enkele) migraties uit die nog niet zijn uitgevoerd.
-
db:createmaakt de database
-
db:dropverwijdert de database
-
db:schema:loadcreëert tabellen en kolommen binnen de bestaande database volgens schema.rb. Hiermee worden bestaande gegevens verwijderd.
-
db:setupdoet db:create, db:schema:load, db:seed
-
db:resetdoet db:drop, db:setup
-
db:migrate:resetdoet db:drop, db:create, db:migrate
Normaal gesproken zou u db:migrate gebruiken nadat u wijzigingen in het schema hebt aangebracht via nieuwe migratiebestanden (dit heeft alleen zin als er al gegevens in de database staan). db:schema:load wordt gebruikt wanneer u een nieuwe instantie van uw app instelt.
Ik hoop dat dat helpt.
UPDATE voor rails 3.2.12:
Ik heb net de bron gecontroleerd en de afhankelijkheden zijn nu als volgt:
-
db:createmaakt de database voor de huidige omgeving
-
db:create:allmaakt de databases voor alle envs
-
db:dropverwijdert de database voor de huidige omgeving
-
db:drop:alllaat de databases voor alle envs vallen
-
db:migratevoert migraties uit voor de huidige env die nog niet zijn uitgevoerd
-
db:migrate:upvoert één specifieke migratie uit
-
db:migrate:downdraait één specifieke migratie terug
-
db:migrate:statustoont de huidige migratiestatus
-
db:rollbackdraait de laatste migratie terug
-
db:forwardgaat de huidige schemaversie vooruit naar de volgende
-
db:seed(alleen) voert het bestand db/seed.rb uit
-
db:schema:loadlaadt het schema in de huidige env-database
-
db:schema:dumpdumpt het huidige env-schema (en lijkt ook de db te maken)
-
db:setupvoert db:schema:load, db:seed uit
-
db:resetvoert db:drop db:setup uit
-
db:migrate:redowordt uitgevoerd (db:migrate:down db:migrate:up) of (db:rollback db:migrate) afhankelijk van de opgegeven migratie
-
db:migrate:resetvoert db:drop db:create db:migrate uit
Kijk voor meer informatie op https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake(voor Rails 3.2.x) en https://github.com/rails/rails/blob/v4. 0.5/activerecord/lib/active_record/railties/databases.rake(voor Rails 4.0.x)
Antwoord 2, autoriteit 2%
TLDR
Gebruik
rake db:migrate
Als u wijzigingen in het schema wilt aanbrengenrake db:reset
Als u de database wilt verwijderen, laadt u het schema opnieuw vanafschema.rb
en plaatst u de database opnieuwrake db:schema:load
Als u de database wilt resetten naar het schema zoals bepaald inschema.rb
(Hiermee worden alle gegevens verwijderd)
Uitleg
rake db:schema:load
stelt het schema in zoals aangegeven in het bestand schema.rb
. Dit is handig voor een nieuwe installatie van de app, aangezien het niet zoveel tijd kost als db:migrate
Belangrijke opmerking,
db:schema:load
zal gegevens op de server verwijderen.
rake db:migrate
brengt wijzigingen aan in het bestaande schema. Het is net als het maken van versies van schema. db:migrate
zoekt in db/migrate/
naar ruby-bestanden en voert de migraties uit die nog niet zijn uitgevoerd, te beginnen met de oudste. Rails weet welk bestand het oudste is door te kijken naar de tijdstempel aan het begin van de migratiebestandsnaam. db:migrate
heeft als voordeel dat gegevens ook in de database kunnen worden gezet. Dit is eigenlijk geen goede gewoonte. Het is beter om rake db:seed
te gebruiken om gegevens toe te voegen.
rake db:migrate
biedt taken omhoog, downetc die commando’s zoals rake db:rollback
mogelijk maakt en het het meest bruikbare commando maakt.
rake db:reset
doet een db:drop
en db:setup
Het laat de database vallen, maakt het opnieuw, laadt het schema en initialiseert met de seed-gegevens
Relevant deel van de commando’s van databases. hark
namespace :schema do
desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
task :dump => [:environment, :load_config] do
require 'active_record/schema_dumper'
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
File.open(filename, "w:utf-8") do |file|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
db_namespace['schema:dump'].reenable
end
desc 'Loads a schema.rb file into the database'
task :load => [:environment, :load_config, :check_protected_environments] do
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
end
# desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
task :reset => [ 'db:drop', 'db:setup' ]
namespace :migrate do
# desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
task :redo => [:environment, :load_config] do
if ENV['VERSION']
db_namespace['migrate:down'].invoke
db_namespace['migrate:up'].invoke
else
db_namespace['rollback'].invoke
db_namespace['migrate'].invoke
end
end
Antwoord 3
Rails 5
db:create
– Creëert de database voor de huidige RAILS_ENVomgeving. Als RAILS_ENVniet is opgegeven, wordt standaard de ontwikkelings- en testdatabase gebruikt.
db:create:all
– Creëert de database voor alle omgevingen.
db:drop
– Verwijdert de database voor de huidige RAILS_ENV-omgeving. Als RAILS_ENVniet is opgegeven, wordt standaard de ontwikkelings- en testdatabase gebruikt.
db:drop:all
– Verwijdert de database voor alle omgevingen.
db:migrate
– Voert migraties uit voor de huidige omgeving die nog niet zijn uitgevoerd. Standaard worden migraties alleen uitgevoerd in de ontwikkelomgeving.
db:migrate:redo
– Voert db:migrate:downen db:migrate:upof db:migrate: uit: rollbacken db:migrate:upafhankelijk van de opgegeven migratie.
db:migrate:up
– Voert de up uit voor de gegeven migratieVERSIE.
db:migrate:down
– Voert de down uit voor de gegeven migratieVERSIE.
db:migrate:status
– Geeft de huidige migratiestatus weer.
db:migrate:rollback
– Draait de laatste migratie terug.
db:version
– Drukt de huidige schemaversie af.
db:forward
– Duwt het schema naar de volgende versie.
db:seed
– Voert het bestand db/seeds.rbuit.
db:schema:load
Maakt de database opnieuw vanuit het bestand schema.rb. Verwijdert bestaande gegevens.
db:schema:dump
Dumpt het schema van de huidige omgeving naar db/schema.rb.
db:structure:load
– Maakt de database opnieuw vanuit het bestand structure.sql.
db:structure:dump
– Dumpt het schema van de huidige omgeving naar db/structure.sql.
(Je kunt een ander bestand specificeren met SCHEMA=db/my_structure.sql
)
db:setup
Voert db:create, db:schema:loaden db:seeduit.
db:reset
Voert db:dropen db:setupuit.
db:migrate:reset
– Voert db:drop, db:createen db:migrateuit.
db:test:prepare
– Controleer op lopende migraties en laad het testschema. (Als je rake gebruikt zonder argumenten, zal het dit standaard doen.)
db:test:clone
– Maak de testdatabase opnieuw op basis van het databaseschema van de huidige omgeving.
db:test:clone_structure
– Vergelijkbaar met db:test:clone, maar het zorgt ervoor dat uw testdatabase dezelfde structuur heeft, inclusief tekensets en sorteringen, als de database van uw huidige omgeving.
db:environment:set
– Stel de huidige RAILS_ENVomgeving in de ar_internal_metadatatabel in. (Gebruikt als onderdeel van de controle van de beveiligde omgeving.)
db:check_protected_environments
– Controleert of een destructieve actie kan worden uitgevoerd in de huidige RAILS_ENV-omgeving. Intern gebruikt bij het uitvoeren van een destructieve actie zoals db:dropof db:schema:load.
Antwoord 4
Voor zover ik begrijp, zal het je database laten vallen en opnieuw maken op basis van je db/schema.rb
-bestand. Daarom moet je ervoor zorgen dat je schema.rb
-bestand altijd up-to-date is en onder versiebeheer staat.
Antwoord 5
Je zou gewoon in de Active Record Rake-taken kunnen kijken, want dat is waar ze volgens mij leven zoals in dit bestand.
https://github.com/rails/ rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb
Wat ze doen, is je vraag toch?
Dat hangt af van waar ze vandaan komen en dit is slechts een voorbeeld om aan te tonen dat ze variëren, afhankelijk van de taak. Hier hebben we een ander bestand vol taken.
https://github.com/rails/rails/blob/fe1f01447956f159447956f159447956 /activerecord/Rakefile
die deze taken heeft.
namespace :db do
task create: ["db:mysql:build", "db:postgresql:build"]
task drop: ["db:mysql:drop", "db:postgresql:drop"]
end
Dit is misschien geen antwoord op je vraag, maar kan je enig inzicht geven om door te gaan en de bron te bekijken, met name de rake-bestanden en taken. Omdat ze je behoorlijk goed helpen bij het gebruik van rails, documenteren ze de code niet altijd zo goed. We zouden daar allemaal kunnen helpen als we weten wat het moet doen.