Difference between rake db:migrate db:reset and db:schema:load

后端 未结 5 787
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 11:48

The difference between rake db:migrate and rake db:reset is pretty clear in my head. The thing which I don\'t understand is how rake db:schem

5条回答
  •  南方客
    南方客 (楼主)
    2020-11-22 12:11

    TLDR

    Use

    • rake db:migrate If you wanna make changes to the schema
    • rake db:reset If you wanna drop the database, reload the schema from schema.rb, and reseed the database
    • rake db:schema:load If you wanna reset database to schema as provided in schema.rb (This will delete all data)

    Explanations

    rake db:schema:load will set up the schema as provided in schema.rb file. This is useful for a fresh install of app as it doesn't take as much time as db:migrate

    Important note, db:schema:load will delete data on server.

    rake db:migrate makes changes to the existing schema. Its like creating versions of schema. db:migrate will look in db/migrate/ for any ruby files and execute the migrations that aren't run yet starting with the oldest. Rails knows which file is the oldest by looking at the timestamp at the beginning of the migration filename. db:migrate comes with a benefit that data can also be put in the database. This is actually not a good practice. Its better to use rake db:seed to add data.

    rake db:migrate provides tasks up, down etc which enables commands like rake db:rollback and makes it the most useful command.

    rake db:reset does a db:drop and db:setup
    It drops the database, create it again, loads the schema, and initializes with the seed data

    Relevant part of the commands from databases.rake


    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
    

提交回复
热议问题