Verschil tussen rake db:migrate db:reset en db:schema:load

Het verschil tussen rake db:migrateen rake db:resetis vrij duidelijk in mijn hoofd. Wat ik niet begrijp, is hoe rake db:schema:loadverschilt 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 een rake 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:migrateAls u wijzigingen in het schema wilt aanbrengen
  • rake db:resetAls u de database wilt verwijderen, laadt u het schema opnieuw vanaf schema.rben plaatst u de database opnieuw
  • rake db:schema:loadAls u de database wilt resetten naar het schema zoals bepaald in schema.rb(Hiermee worden alle gegevens verwijderd)

Uitleg

rake db:schema:loadstelt 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:loadzal gegevens op de server verwijderen.

rake db:migratebrengt wijzigingen aan in het bestaande schema. Het is net als het maken van versies van schema. db:migratezoekt 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:migrateheeft als voordeel dat gegevens ook in de database kunnen worden gezet. Dit is eigenlijk geen goede gewoonte. Het is beter om rake db:seedte gebruiken om gegevens toe te voegen.

rake db:migratebiedt taken omhoog, downetc die commando’s zoals rake db:rollbackmogelijk maakt en het het meest bruikbare commando maakt.

rake db:resetdoet een db:dropen 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:loadMaakt de database opnieuw vanuit het bestand schema.rb. Verwijdert bestaande gegevens.

db:schema:dumpDumpt 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:setupVoert db:create, db:schema:loaden db:seeduit.

db:resetVoert 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.

Other episodes