2012-11-01 3 views
30

나는이 테스트 데이터베이스를 지금까지 정크로 가득 채웠습니다. 이제 레일즈 콘솔에서 모든 레코드와 종속성을 삭제하는 몇 가지 Table.destroy_all 명령을 수행했습니다. 하나; 나는 ID의 등등이 다시 1에서 시작하도록 모든 것을 자르고 싶습니다. Rails 3에 어떤 방법이 있습니까?레일 콘솔이있는 테이블을 자릅니다.

답변

104

허용 대답에만 작동합니다.

Model.destroy_all # Only necessary if you want to trigger callbacks. 
ActiveRecord::Base.connection.execute("Delete from #{table_name}") 
ActiveRecord::Base.connection.execute("DELETE FROM SQLITE_SEQUENCE WHERE name='#{table_name}'") 
: 그렇게 다음을 수행 TRUNCATE 지원하지 않습니다,

Model.destroy_all # Only necessary if you want to trigger callbacks. 
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY") 

당신이 SQLite는을 사용하는 경우
은 (콜백 포함) 단일 테이블을 삭제하고 ID를 1부터 시작 얻을 수

+2

한 테이블을 잘랐을 때의 답이 맞습니다. (그리고 고마워합니다.) 나는 "모든 것"을 잘라 버릴 것을 요구했기 때문에 Yam Marcovic의 대답을 받아 들였습니다. – CaptainCarl

+4

투표 해 주셔서 감사합니다. 전체 db 요구 사항은 질문에서 명확하지 않았습니다!단지 정보를 위해서, rake db : drop은 데이터베이스를 삭제할 것입니다. 요구 사항이 모든 테이블을 잘라내는 것이라면, ActiveRecord :: Base.connection.tables.collect {| table_name | ActiveRecord :: Base.connection.execute ("TRUNCATE # {table_name}")}. 그것은 콜백을 돌볼 수는 없지만 모든 테이블을 잘라내는 것은 필요하지 않다고 생각합니다. –

+0

destroy_all은 각 레코드에서 destroy를 호출합니다. 이는 테이블을 잘라 버리는 것과는 완전히 다릅니다. From Documents : # 각각의 # 레코드를 인스턴스화하고 + destroy + 메소드를 호출하여 + conditions +와 일치하는 레코드를 소멸시킵니다. 각 객체의 콜백은 # 실행되었습니다 ( : 종속성 연관 옵션 및 # + before_destroy +/after_destroy + Observer 메소드 포함). 파괴 된 객체 컬렉션 # 을 반환합니다. 각각 # 변경 사항을 적용하지 말아야 함을 나타냅니다 ( # persisted 일 수 없으므로). – justingordon

3

다음 테스트 실행시 데이터베이스를 다시 작성하기 만하면됩니다 (삭제 후 자동으로 실행됩니다). 당신은 전체 데이터베이스를 다시해야하는 경우

rake db:drop RAILS_ENV=test

3

rake db:rollback STEP=3 RAILS_ENV=test

여기서 3은 db/migrate에있는 마이그레이션 수를 나타냅니다. 예를 들어 : 가지고있는 경우

db/migrate 
20140121065542_create_users.rb 
20140121065710_create_profiles.rb 
20140121065757_create_articles.rb 
20140121065900_create_comments.rb 
20140121065929_create_categories.rb 

따라서 총 5 개의 마이그레이션을 제거해야합니다. 내가 rake db:rollback STEP=5 RAILS_ENV=test을 수행하면 모든 테이블이 내 테스트 데이터베이스에서 삭제되고 모든 환경 (생산, 테스트, 개발) 테이블이 RAILS_ENV = 테스트를 삭제하고 테이블이 삭제되고 마이그레이션 데이터에서 db/shema.rb 파일도 삭제됩니다 .

2

rake db:resetrake db:drop db:setup입니다. 즉, 데이터베이스를 제거하고 데이터베이스를 다시 설정하십시오. 콘솔에서이 작업을 수행하기 위해 요구

Source

+0

이렇게하면 중요한 DATA를 잃어 버릴 것이므로 권장하지 않는 것이 좋습니다. –

0

(파티에 조금 늦게, 내가 아는)

:

2.1.2 :001 > Post.all.each do |post| 
2.1.2 :002 > post.destroy! 
2.1.2 :003 > end 

뿐만 아니라 작품 ...

이를 본질적으로 모든 게시물을 반복하고 그들을 파괴합니다.

이것은 나를 위해 일한
+2

1.'each'를 사용하지 말고'find_each'를 사용하십시오. 그것은 하나의 쿼리에서 10 억 개의 레코드를 얻지 못하도록합니다. 2. 콜백을 실행하지 않고 DB에서 레코드를 삭제해야하는 경우 루프를 사용하지 마십시오. 그냥'Post.delete_all'을하십시오. – Kukunin

4

>>> 액티브 :: 자료 (나는 레일 4를 사용하고 있지만) 그래도 ...

같은 논리뿐만 아니라 레일 3 일을해야 당신의 자동 증가 값을 변경하지 않습니다. 이 것이

MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) } 

참고 : connection.execute ("TRUNCATE의 테이블 _")

1

당신은 MySQL의 또는 Postgre하지 sqlite3를을 (TRUNCATE를 지원하지 않는)를 사용하는 가정은 다음을 수행 할 수 ActiveRec를 호출하지 않는다. ord 콜백.

관련 문제