Raylarda tek bir masa nasıl sıfırlanır?


86

Birincil anahtar değerlerinin tekrar 1'den başlamasını istiyorum.

Yanıtlar:


27

SQLite'da indeksi / birincil anahtarı sıfırlamak için şunu yazın:

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

1
cevabınızdan ilham alarak ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye

1
Birinin bunu denediği ve bir hata ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")alması durumunda, yaptım ve işe yaradı çünkü bana söyleyen bir hata sqlite_sequence where name = 'yourtablename' is not a valid table nameveya buna benzer bir şey verirdi .
l1zZY

185

Pek çok insan (benim gibi) tablodaki tüm verileri nasıl sileceğini bulmak için buraya geliyor. Hadi bakalım:

$ rails console

> ModelName.delete_all

veya

> ModelName.destroy_all

destroy_all bağımlılıkları ve geri aramaları denetler ve biraz daha uzun sürer. delete_all düz bir SQL sorgusudur.

Daha fazla bilgi burada: http://apidock.com/rails/ActiveRecord/Base/delete_all/class


14
Bu çözüm, tablo girişlerini sıfırlar, ancak birincil anahtarı sıfırlamaz.
Justin D.

4
Evet bu harika - ama endeksi sıfırlamak istiyorum! Delete_all veya destroy_all dizini 1'e sıfırlamıyor.
Kyle Clegg

Bu cevap, ona ulaşan çoğunluktaki kullanıcıların sorusunu çözdü. Gerçekten önemli olan bu. Bunun yanı sıra, tek cevap bu değil ve doğru cevap olarak işaretlenmemiş. Yazar ayrıca niyetini açıkladı. Bu yüzden herhangi bir sorun görmüyorum.
Edison Machado

45

Tablodaki her şeyi silmek ve ardından indeks sayacını sıfırlamak için rails konsolundan aşağıdakileri kullanıyorum (Ruby 2 & Rails 4):

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

3
Bu benim için gerçekten iyi çalıştı, ancak küçük bir ayrıntı, model_namesıfırlama komutundaki sizin modelin tekil adı DEĞİL, tablonun gerçek adı gibi çoğul olması gerektiğidir.
Eli Duke

Ayrıca sembolik sürümü ile çalışır: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice

18

@ khelll'in bağlantısı faydalıdır. Bir tabloyu kesmek istediğiniz komut şudur:

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

16

Rails 4.2'den bu yana, truncatedoğrudan bir ActiveRecord bağlantısı üzerinde kullanabilirsiniz :

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

Bu, tüm verileri siler ve tablodaki otomatik artış sayaçlarını sıfırlar . MySQL ve Postgres İşleri, gelmez SQLite çalışır.


10

Ekle gem 'database_cleaner', senin Gemfile koşmak $ bundle installsonra ve:

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

Daha fazla tablo belirtebilirsiniz:

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

Son parametreyi dışarıda bırakırsanız, tüm veritabanını keser:

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

6

Rails 4.2.0 ve Sqlite3 kullanıyorum

İşte benim için işe yarayan şey (yukarıdakilerin hepsinden biraz alarak):

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

Daha sonra 1'den başlayan dizinle tabloma yeni kayıtlar ekleyebildim


1

Veritabanı Postgres olduğunda bu sorunun cevabını arayanlar için, bunu Rails konsolundan yapabilirsiniz:

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

Nerede accountsiçinde accounts_id_seqtablonun adıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.