rake db : migrate db : reset과 db : schema : load의 차이점


619

내 머리 rake db:migrate와 의 차이점은 rake db:reset분명합니다. 내가 이해하지 못하는 것은 rake db:schema:load이전 두 가지와 얼마나 다른지입니다.

같은 페이지에 있는지 확인하십시오.

  • rake db:migrate -아직 실행되지 않은 마이그레이션을 실행합니다.
  • rake db:reset-데이터베이스를 지우고 (아마도 rake db:drop+ rake db:create+ 수행 rake db:migrate) 새 데이터베이스에서 마이그레이션을 실행합니다.

이해가 잘못되면 명확하게 도와주세요.


10
합니까의 rake --tasks도움?
zx1986

이 블로그를 확인해야합니다. jacopretorius.net/2014/02/…
Bishisht Bhatta

당신의 이해 rake db:migrate는 정확하지만, 당신의 이해 rake db:reset는 틀립니다. Moritz의 최상위 답변을 참조하십시오.
Magne

1
BTW, 레일 5로, 이러한 명령으로 호출 할 수 있습니다 rails db:migrate, rails db:reset, rails db:schema:load. 참조 stackoverflow.com/questions/38403533/...
Purplejacket

답변:


1303
  • db : migrate 아직 실행되지 않은 (단일) 마이그레이션을 실행합니다.
  • db : create 는 데이터베이스를 생성합니다
  • db : drop 은 데이터베이스를 삭제합니다
  • db : schema : load는 schema.rb에 따라 기존 데이터베이스 내에 테이블과 열을 작성합니다.

  • db : setup 은 db : create, db : schema : load, db : seed를 수행합니다.

  • db : reset 은 db : drop, db : setup을 수행합니다.
  • db : migrate : reset 은 db : drop, db : create, db : migrate를 수행합니다.

일반적으로 새 마이그레이션 파일을 통해 스키마를 변경 한 후 db : migrate를 사용합니다 (데이터베이스에 이미 데이터가있는 경우에만 의미가 있습니다). db : schema : load는 앱의 새 인스턴스를 설정할 때 사용됩니다.

도움이 되길 바랍니다.


레일 3.2.12 업데이트 :

방금 소스를 확인했으며 종속성은 다음과 같습니다.

  • db : create 는 현재 환경에 대한 데이터베이스를 만듭니다.
  • db : create : all 은 모든 환경에 대한 데이터베이스를 만듭니다.
  • db : drop 은 현재 환경에 대한 데이터베이스를 삭제합니다.
  • db : drop : all 은 모든 환경에 대한 데이터베이스를 삭제합니다.
  • db : migrate 는 아직 실행되지 않은 현재 환경에 대한 마이그레이션을 실행합니다.
  • db : migrate : up 은 하나의 특정 마이그레이션을 실행합니다
  • db : migrate : down은 하나의 특정 마이그레이션을 롤백합니다.
  • db : migrate : status 는 현재 마이그레이션 상태를 보여줍니다 .
  • db : rollback 은 마지막 마이그레이션을 롤백 합니다.
  • db : forward 는 현재 스키마 버전을 다음 버전으로 전진 시킵니다.
  • db : seed (전용) db / seed.rb 파일을 실행합니다
  • db : schema : load 는 현재 환경 데이터베이스에 스키마를로드합니다.
  • db : schema : dump 는 현재 환경의 스키마를 덤프 합니다 (그리고 db도 생성하는 것 같습니다)

  • db : setup 은 db : schema : load, db : seed를 실행합니다

  • db : reset 은 db : drop db : setup을 실행합니다.
  • 지정된 마이그레이션에 따라 db : migrate : redo실행 됩니다 (db : migrate : down db : migrate : up) 또는 (db : rollback db : migrate)
  • db : migrate : reset 실행 db : drop db : create db : migrate

자세한 내용은 https://github.com/rails/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake(Rails 3.2.x) 및 https : // github를 참조하십시오. .com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railties / databases.rake (rails 4.0.x 용)


16
여기에 답이있는 파일이 있습니다 :)- github.com/rails/rails/blob/master/activerecord/lib/…
cutalion

3
@cutation : db : setup은 db : migrate를 실행하지 않습니다. 왜냐하면 db 설정에 대해서만 모든 마이그레이션을 실행하기에는 너무 취하기 때문입니다 (schema.rb의 목적).
moritz

2
db : reset을 실행 중이며 내 DB를 시드하고 있습니다. 왜 그런가요?
Alejandro Riedel

db:create필요한 경우 db : setup 도 실행 됩니다. 적어도 레일 기준 4.0.2.
Dan

Rails 4 는 보류중인 마이그레이션이 있지만 보류중인 마이그레이션을 실행하지 않는 rake db:migrate경우 호출 할 때 수행 rake db:setup합니다.
Pooyan Khosravi

24

TLDR

사용하다

  • rake db:migrate 스키마를 변경하려는 경우
  • rake db:reset데이터베이스를 삭제하려면에서 스키마를 다시로드하고 데이터베이스를 다시 schema.rb시드하십시오.
  • rake db:schema:load제공된대로 데이터베이스를 스키마로 재설정하려는 경우 schema.rb(모든 데이터가 삭제됨)

설명

rake db:schema:loadschema.rb파일에 제공된대로 스키마를 설정 합니다. 시간이 오래 걸리지 않으므로 새로 설치 한 앱에 유용합니다.db:migrate

중요 참고, db:schema:load삭제 서버에 데이터를.

rake db:migrate기존 스키마를 변경합니다. 스키마 버전을 만드는 것과 같습니다. 루비 파일 db:migrate을 찾아서 db/migrate/가장 오래된 것으로 시작되지 않은 마이그레이션을 실행합니다. Rails는 마이그레이션 파일 이름의 시작 부분에서 타임 스탬프를보고 가장 오래된 파일을 알고 있습니다. db:migrate데이터를 데이터베이스에 넣을 수도 있다는 이점이 있습니다. 이것은 실제로 좋은 습관이 아닙니다. rake db:seed데이터를 추가하는 데 사용 하는 것이 좋습니다 .

rake db:migrate작업을 , 아래 등으로 제공 하여 같은 명령을 활성화 rake db:rollback하고 가장 유용한 명령으로 만듭니다.

rake db:resetA는 않습니다 db:dropdb:setup
종자 데이터와 스키마를 다시 만들로드, 데이터베이스을 삭제, 초기화합니다

데이터베이스 의 명령과 관련이 있습니다.


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

따라서 db : schema : load (일련의 이전 마이그레이션에서 생성됨)를 사용하여 프로덕션 스키마를 만들면 향후 마이그레이션 할 필요가없는 마이그레이션 (초기 schema.rb 생성)을 알 수 있습니다. db : migrate의 호출?
CanadaIT

2

내가 이해하는 한 데이터베이스를 삭제하고 db/schema.rb파일을 기반으로 다시 만듭니다 . 따라서 schema.rb파일이 항상 최신 상태이고 버전 관리 상태 인지 확인해야합니다 .


0

Active Record Rake 작업은이 파일에서와 같이 존재한다고 생각하기 때문에 간단하게 볼 수 있습니다. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

그들이하는 일은 당신의 질문에 맞습니까?

그것은 그들이 어디에서 왔는지에 달려 있으며 이것은 과제에 따라 다양하다는 것을 보여주는 단지 예입니다. 여기에 작업으로 가득 찬 다른 파일이 있습니다.

https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

이 작업이 있습니다.

namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end

이것은 귀하의 질문에 대답하지 못할 수도 있지만, 갈퀴 파일과 작업을 통해 소스를 살펴볼 수 있습니다. 그들은 레일 사용을 도와주는 훌륭한 일을 할 때 항상 코드를 잘 설명하지는 않습니다. 우리가해야 할 일을 알면 우리 모두가 도울 수 있습니다.


기사가 제거 된 경우 기사의 관련 부분을 인용하십시오. 이유를 설명하지 않고 무언가를하도록 제안하지 마십시오.
PhilT

0

Rails 5 용으로 업데이트 :

db:create-현재 RAILS_ENV 환경에 대한 데이터베이스를 작성 합니다. 경우 RAILS_ENV는 그것을 개발 및 테스트 데이터베이스에 대한 기본값으로 지정되어 있지 않습니다.

db:create:all -모든 환경에 대한 데이터베이스를 작성합니다.

db:drop-현재 RAILS_ENV 환경에 대한 데이터베이스를 삭제 합니다. 경우 RAILS_ENV는 그것을 개발 및 테스트 데이터베이스에 대한 기본값으로 지정되어 있지 않습니다.

db:drop:all -모든 환경에 대한 데이터베이스를 삭제합니다.

db:migrate-아직 실행되지 않은 현재 환경에 대한 마이그레이션을 실행합니다. 기본적으로 개발 환경에서만 마이그레이션을 실행합니다.

db:migrate:redo- 지정된 마이그레이션에 따라 db : migrate : downdb : migrate : up 또는 db : migrate : rollbackdb : migrate : up을 실행 합니다.

db:migrate:up -지정된 마이그레이션 버전에 대해 가동을 실행합니다.

db:migrate:down -주어진 마이그레이션 버전에 대해 다운을 실행합니다.

db:migrate:status -현재 마이그레이션 상태를 표시합니다.

db:migrate:rollback -마지막 마이그레이션을 롤백합니다.

db:version -현재 스키마 버전을 인쇄합니다.

db:forward -스키마를 다음 버전으로 푸시합니다.

db:seed-db / seeds.rb 파일을 실행 합니다.

db:schema:loadschema.rb 파일 에서 데이터베이스를 다시 만듭니다 .

db:schema:dump현재 환경의 스키마를 db / schema.rb로 덤프합니다 .

db:structure:load- 재현로부터 데이터베이스 structure.sql의 파일.

db:structure:dump-현재 환경의 스키마를 db / structure.sql로 덤프합니다 . (로 다른 파일을 지정할 수 있습니다 SCHEMA=db/my_structure.sql)

db:setup실행은 을 db : 생성 , DB를 : 스키마 : 부하DB를 : 씨 .

db:reset실행은 을 DB : 드롭DB를 : 설치를 . db:migrate:reset- 런은 을 DB : 드롭 , DB를 : 생성DB : 마이그레이션을 .

db:test:prepare-보류중인 마이그레이션을 확인하고 테스트 스키마를로드하십시오. 인수없이 레이크를 실행하면 기본적으로이 작업이 수행됩니다.

db:test:clone -현재 환경의 데이터베이스 스키마에서 테스트 데이터베이스를 다시 작성하십시오.

db:test:clone_structure-db : test : clone 과 유사 하지만 테스트 데이터베이스가 현재 환경의 데이터베이스와 문자셋 및 데이터 정렬을 포함하여 동일한 구조를 갖도록합니다.

db:environment:set-ar_internal_metadata 테이블 에서 현재 RAILS_ENV 환경을 설정하십시오 . (보호 된 환경 점검의 일부로 사용됩니다.)

db:check_protected_environments-현재 RAILS_ENV 환경 에서 파괴적인 작업을 수행 할 수 있는지 확인 합니다. db : drop 또는 db : schema : load 와 같은 파괴적인 조치를 실행할 때 내부적으로 사용됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.