레일에서 단일 테이블을 재설정하는 방법은 무엇입니까?


답변:


27

SQLite에서 인덱스 / 기본 키를 재설정하려면 다음을 입력하십시오.

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")

1
당신의 대답에서 영감을 복용 ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye

1
누군가 이것을 시도하고 오류가 발생하는 경우 나는 그렇게 ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")했고 그것은 나에게 그런 말 sqlite_sequence where name = 'yourtablename' is not a valid table name이나 비슷한 오류를 줄 것이기 때문에 작동했습니다 .
l1zZY

184

저와 같은 많은 사람들이 테이블의 모든 데이터를 삭제하는 방법을 찾기 위해 여기에 왔습니다. 여기 있습니다 :

$ rails console

> ModelName.delete_all

또는

> ModelName.destroy_all

destroy_all은 종속성 및 콜백을 확인하고 시간이 조금 더 걸립니다. delete_all은 직접적인 SQL 쿼리입니다.

자세한 정보 : http://apidock.com/rails/ActiveRecord/Base/delete_all/class


14
이 솔루션은 테이블 항목을 재설정하지만 기본 키는 재설정하지 않습니다.
Justin D.

4
그래 이것은 훌륭하지만 인덱스를 재설정하고 싶습니다! DELETE_ALL 또는 destroy_all 어느 쪽도 1로 인덱스를 재설정한다
카일 클레

이 답변은 도달 한 대다수 사용자의 질문을 해결했습니다. 그것이 정말로 중요한 것입니다. 그 외에도 유일한 답변이 아니며 올바른 답변으로 표시되지 않았습니다. 저자는 또한 그의 의도를 설명했습니다. 그래서 나는 어떤 문제도 보지 않는다.
Edison Machado

45

Rails 콘솔에서 다음을 사용하여 테이블의 모든 항목을 삭제 한 다음 인덱스 카운터 (Ruby 2 및 Rails 4)를 재설정했습니다.

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')

3
이것은 나를 위해 정말 잘 작동했지만, 작은 세부 사항은 model_name재설정 명령에서 모델의 단수 이름이 아닌 테이블의 실제 이름과 같이 복수형이 필요하다는 것입니다.
Eli Duke

기호 버전 인 ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice 2018

18

@khelll의 링크가 도움이됩니다. 하나의 테이블을 자르려는 명령은 다음과 같습니다.

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")

16

Rails 4.2부터 ActiveRecord 연결truncate 에서 직접 사용할 수 있습니다 .

ActiveRecord::Base.connection.truncate(:table_name)

모든 데이터를 쳐 하고 자동 증가 카운터를 재설정 표에. MySQL 및 Postgres에서 작동하며 Sqlite 에서는 작동 하지 않습니다 .


10

gem 'database_cleaner'Gemfile에 추가 하고을 실행 $ bundle install한 후 다음을 수행하십시오.

> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])

더 많은 테이블을 지정할 수 있습니다.

> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])

마지막 매개 변수를 그대로두면 전체 데이터베이스가 잘립니다.

> DatabaseCleaner.clean_with(:truncation) # your database is truncated

6

Rails 4.2.0 및 Sqlite3를 사용하고 있습니다.

저에게 도움이 된 것은 다음과 같습니다 (위의 모든 것에서 약간 가져옴).

$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")

그런 다음 인덱스가 1부터 시작하여 테이블에 새 레코드를 추가 할 수있었습니다.


1

데이터베이스가 Postgres 일 때이 질문에 대한 답을 찾는 다른 사람은 Rails 콘솔에서 다음을 수행 할 수 있습니다.

rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")

어디 accounts에서이 accounts_id_seq테이블의 이름입니다.

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