Ruby on Rails 데이터베이스 제거 또는 재 작성


582

데이터로 가득 찬 개발자 Ruby on Rails 데이터베이스가 있습니다. 모든 것을 삭제하고 데이터베이스를 다시 만들고 싶습니다. 나는 다음과 같은 것을 사용하려고 생각하고있다 :

rake db:recreate

이것이 가능한가?


가장 높은 답을 얻은 답을 지나는 것이 좋습니다. 내 의견으로 rake db:drop db:create db:schema:loadrake db:drop db:create db:migrate(나는 그것에 대해 틀릴 준비가되어 있지만) 보다 더 적절할 수 있습니다 .
Jason Swett


2
rake db:drop db:create db:migrate
윌리엄 햄프셔

db:drop + db:create + db:migrate == db:migrate:reset. 나는 db:schema:load이주가 깨질 때 주로 의지한다 . 데이터베이스를 다시 만들 필요가 없으므로 속도는 중요하지 않습니다. 또한 적용되지 않은 마이그레이션이 db:schema:load있고 db:reset적용되지 않는 경우. 그것이 많은 논쟁인지 확실하지 않습니다.
x-yuri

답변:


1074

이 작업을 수행하는 두 가지 방법을 알고 있습니다.

그러면 데이터베이스가 재설정되고 현재 스키마가 모두 다시로드됩니다.

rake db:reset db:migrate

그러면 DB가 삭제되고 생성 된 다음 현재 스키마가 마이그레이션됩니다.

rake db:drop db:create db:migrate

두 시나리오에서 모든 데이터가 손실됩니다.


36
또한 rake db:reset모든 마이그레이션 (적어도 Rails 3에서)을 실행하는 것 같습니다 .
plindberg

1
또는 스키마를 모든 마이그레이션 실행과 동일하게 둡니다. 그러나 마이그레이션 자체는 실행되지 않습니다 (따라서 데이터를 삽입하는 마이그레이션이있는 경우에는 발생하지 않습니다.이를 위해서는 실제로 db / seeds.rb 파일을 사용해야합니다).
plindberg

1
Tracks GTD app db : migrate가 작동하지 않는다는 것을 알고 있습니다. Sqlite3에서 Postgres로 이동할 때 db : reset을 수행해야했습니다.
미로

11
또한 rake db:test:prepare테스트 를 위해 실행해야합니다. 그렇지 않으면 다음과 같은 오류가 발생합니다.Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2

31
누군가가 명확 있는지 확인해야 rake db:reset하고 rake db:drop db:create db:migrate 두 개의 완전히 다른 일을 . 후자는 전체 앱 데이터베이스를 지우고 다시 만든 다음 모든 마이그레이션을 거쳐 스키마 ( db/schema.rb또는 db/structure.sql) 를 업데이트 하지만 시드 데이터로 채우지는 않습니다. 첫 번째는에 대한 별칭 rake db:drop db:schema:load db:seed이므로 전체 앱 데이터베이스를 지우지 만 스키마를 업데이트하지 않고 시드 데이터로 채 웁니다. 따라서 마이그레이션에서 아무것도 변경하지 않은 경우 첫 번째가 빠를수록 후자가 더 안전합니다.
Claudio Floreani

157

Rails 4에서 필요한 것은

$ rake db:schema:load

그러면 모든 마이그레이션을 하나씩 적용하지 않고도 DB의 전체 내용을 삭제하고 schema.rb 파일에서 스키마를 다시 만들 수 있습니다.


6
레일 3에서도 작동합니다. 테스트 데이터베이스를 엉망으로 만들고 개발자 데이터베이스와 일치하는 작동 버전으로 재설정하고자 할 때 유용합니다.
bigpotato

고마워 나는 그것을 몰랐 db:dropdb:create중복 있었다.
Grant Birchmeier

3
이것은 스키마를 업데이트하지 않으며 마이그레이션을 리팩터링하는 경우 안전한 방법이 아닙니다.
Claudio Floreani

이것은 나에게 가장 좋은 대답입니다.
roxdurazo

2
@ClaudioFloreani 리팩토링 마이그레이션에서 문제가 발생했습니다. 일단 도망친 후에는 영구적으로 내버려 두어야합니다.
nrowegt

45

터미널에서 다음 하나의 라이너를 사용합니다.

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

이것을 쉘 별칭으로 넣고 이름을 지정했습니다. remigrate

이제 Rails 작업을 쉽게 "체인"할 수 있습니다.

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+

12
확장이 불가능하고 오류가 발생하기 쉬운 모든 마이그레이션이 차례대로 실행됩니다. 또한 db : migrate가 schema.rb를 업데이트하므로 schema : dump가 유용한 작업을 수행하지 않습니다.
coreyward

그래서 어떻게 데이터베이스를 비울까요? 개발 중 ... 모두 해결하십시오.
AnApprentice

3
@AnApprentice 당신은 db:reset구글 (또는 가이드에서 확인 ) 거리 에서 실행할 수 있습니다 . 내 의견은 그 사용에 대해 조언하지는 않았지만 db:migrate실제로 원하는 것이 사용되지 않도록 피하는 것이 좋습니다 db:schema:load.
coreyward

7
그건 그렇고, @TK, 당신은 실제로 마지막 종료 상태에 따라 별도의 프로세스로 이들을 모두 실행할 필요가 없습니다. 대신에, 단지에 원하는 모든 작업을 전달할 rake과 같이, : rake db:drop db:create db:schema:load.
coreyward

1
일화 적이지만 실행중인 문제는 없었지만 db:migrate.... db:schema:load새로운 마이그레이션과 함께 schema.rb를 버전 제어로 확인하는 것을 잊어 버리는 사람에게는 민감합니다.
johncip

37

업데이트 : Rails 5에서이 명령은 다음 명령을 통해 액세스 할 수 있습니다.

rails db:purge db:create db:migrate RAILS_ENV=test


최신 레일스 4.2 릴리스부터 다음을 실행할 수 있습니다.

rake db:purge 

출처 : 커밋

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

위에서 언급 한 것처럼 함께 사용할 수 있습니다.

rake db:purge db:create db:migrate RAILS_ENV=test

@bekicot는 평범한 영어로 db:purge"모든 데이터를 제거하지만 모든 테이블과 열을 보존합니다"
MCB

@MCB 나는 틀렸다, 그것에 대해 걱정 db:purge , 테이블을 보존하지 않습니다.
Yana Agun Siswanto

29

당신이 원하는 것에 따라, 당신은 사용할 수 있습니다…

rake db:create

… 처음부터 데이터베이스를 구축 config/database.yml하거나…

rake db:schema:load

schema.rb파일 에서 처음부터 데이터베이스를 구축 합니다.


1
먼저 데이터베이스를 삭제해야합니다. 또는 원하는 경우 테이블을 삭제할 수 있습니다.
coreyward

5
스키마로드의 경우 +1 때때로 마이그레이션이 엉망이되지만 스키마는 그대로 유지되어야합니다.
Danny

모든 마이그레이션을 실행하는 것과 달리 Rails 3 Way에서 스키마를로드하는 것이 좋습니다. 나는 그들의 추론이 무엇인지 정확히 기억하지 못하지만 이해되는 것 같습니다. 최종 결과가 어느 쪽이든 같으면 많은 마이그레이션을 실행하는 것보다 스키마에서 데이터베이스를로드하는 것이 더 간단하고 오류가 적은 것처럼 보입니다.
Jason Swett

3
그 이유는 마이그레이션이 데이터 를 마이그레이션 하고 모델이 변경됨에 따라 시간이 지남에 따라 점점 취약 해지기 때문입니다. 실행 가능한지 확인할 수있을 때마다 최소 범위가 지정된 모델을 마이그레이션으로 구울 수 있습니다. 그러나 이는 확장 성이 우수하지 않으며 애플리케이션이 알고있는 것에서 데이터베이스를 구축하는 것보다 훨씬 효율적이지 않습니다. . 블루 프린트 자체에서 빌드 할 수있을 때 스키마와 유사한 데이터베이스를 작성하기 위해 마이그레이션에 의존하는 이유는 무엇입니까?
coreyward

13

명령 행에서

rake db:migrate:reset

이것이 앱이 모든 마이그레이션을 다시 실행하게하는 유일한 방법입니다. 각각의 마이그레이션을 변경하게하기 때문에 schema.rb그리고 만약 당신 만 drop하고 create, migrate(6 레일 테스트) 아무것도하지 않는 것
샴푸

12

처럼 사용

rake db:drop db:create db:migrate db:seed

한 줄로 환경이 계속해서 다시로드되지 않기 때문에 더 빠릅니다.

db : drop- 데이터베이스를 삭제합니다.

db : create- 데이터베이스를 작성합니다 (host / db / password는 config / database.yml에서 가져옵니다)

db : migrate- 디렉토리 (db / migration / .rb) * 에서 기존 마이그레이션을 실행 합니다.

db : seed- 디렉토리 (db / migration / seed.rb) 에서 가능한 시드 데이터를 실행합니다 .

나는 보통 선호한다 :

rake db:reset

한 번에 모두 할 수 있습니다.

건배!


1
좋은 측정을 위해 db : test : prepare를 추가하고 싶습니다. 물론 테스트 중인지 여부에 따라 다릅니다.
ctc

db:reset == db:drop + db:schema:load + db:seed,db:migrate:reset == db:drop + db:create + db:migrate
X-유리

11

단계 순서 만 수행하십시오. 데이터베이스를 삭제 한 후 다시 작성하고 데이터를 마이그레이션 한 후 시드가있는 경우 데이터베이스를 파종하십시오.

rake db:drop db:create db:migrate db:seed

에 대한 기본 환경 rakedevelopment 이므로 사양 테스트에서 예외가 표시되면 다음과 같이 테스트 환경에 대한 db를 다시 작성해야 합니다.

RAILS_ENV=test rake db:drop db:create db:migrate

대부분의 경우 테스트 절차 중에 테스트 데이터베이스를 파종하므로 db:seed작업 작업을 전달할 필요가 없습니다. 그렇지 않으면 데이터베이스를 준비해야합니다.

rake db:test:prepare

또는

RAILS_ENV=test rake db:seed

또한 재생성 작업 을 사용 하려면 다음 코드 를 Rakefile에 추가 할 수 있습니다 .

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

그런 다음 발행하십시오.

rake db:recreate

8

수동으로 다음을 수행 할 수 있습니다.

rake db:drop
rake db:create
rake db:migrate

또는 그냥 rake db:reset위의 단계를 실행하지만 db/seeds.rb파일 도 실행합니다 .

추가 된 미묘한 차이는 모든 마이그레이션 파일을 다시 실행하는 대신 파일 rake db:reset에서 직접로드 한다는 것 schema.rb입니다.

모든 경우에 데이터가 사라집니다.


6

다음 명령 줄을 사용할 수 있습니다.

rake db:drop db:create db:migrate db:seed db:test:clone

4

특정 데이터베이스를 삭제하려면 레일 콘솔에서 다음을 수행하십시오.

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

그런 다음 DB를 다시 마이그레이션하십시오.

$bundle exec rake db:migrate 

4

Rails 4.2에서 모든 데이터를 제거하고 데이터베이스를 보존

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md


글쎄 ... 방금 시도했지만 테이블과 열을 보존하지는 않습니다. db : purge를 실행 한 후에 db : migrate를 실행해야합니다. 따라서 이것은 테이블과 열을 유지하지 않습니다. 그러나 데이터베이스 자체를 보존하므로 db : create
Freddo

1
@Cedric 맞습니다. db : purge는 테이블을 보존하지 않습니다. 코드를 업데이트했습니다.
Yana Agun Siswanto

3

당신은 사용할 수 있습니다 db:reset- 실행 데시벨을 위해 : 드롭 및 DB : 설치 또는 db:migrate:reset- 실행 DB를 : 드롭, DB를 : 생성 및 DB : 마이그레이션.

존재하려는 schema.rb에 의존


2

Rails 안내서 에 따르면 ,이 하나의 라이너는 schema.rb마이그레이션 파일을 하나씩 다시로드하는 대신 로드하기 때문에 사용해야합니다 .

rake db:reset

1

개발 과정에서 항상 데이터베이스를 다시 만들고 싶기 때문에 lib / tasks 폴더에 레이크 작업을 정의 할 수 있습니다.

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

터미널에서 당신은 실행됩니다

rake db:all

데이터베이스를 재 구축합니다


1

이 명령을 실행하는 가장 좋은 방법은 다음과 같습니다.

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed

1

간단히 당신은 실행할 수 있습니다

rake db:setup

시드 파일을 일부 데이터로 만든 경우 데이터베이스를 삭제하고 새 데이터베이스를 생성하며 시드에서 db를 채 웁니다.


1

3 가지 옵션, 동일한 결과 :

1. 모든 단계 :

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. 리셋 :

  $ rake db:reset          # drop / schema:load / seed

3. 이주 : 재설정 :

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

노트:

  • schema : load가 사용되는 경우 모든 마이그레이션을 수행하는 것보다 빠르지 만 결과는 같습니다.
  • 모든 데이터가 손실됩니다.
  • 한 줄에 여러 갈퀴를 실행할 수 있습니다.
  • 레일과 함께 작동 3.

0

나는 오늘 내 레일 스키마를 상당히 변경했습니다. 계층 구조에 두 가지 모델이 더 필요하고 일부 모델은 삭제해야한다는 것을 깨달았습니다. 모델과 컨트롤러에는 약간의 변경이 필요했습니다.

두 가지 새로운 모델을 추가하고 다음을 사용하여 만들었습니다.

rake db:migrate

그런 다음 schema.rb 파일을 편집했습니다. 더 이상 필요하지 않은 이전 모델을 수동으로 제거하고 필요에 따라 외래 키 필드를 변경 한 다음 조금 더 명확하게하기 위해 순서를 다시 정렬했습니다. 나는 삭제 모든 마이그레이션을 다음을 통해 빌드를 다시 실행 :

rake db:reset

완벽하게 작동했습니다. 물론 모든 데이터를 다시로드해야합니다. Rails는 마이그레이션이 삭제되었고 최고 수위를 재설정했다는 것을 깨달았습니다.

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.