2012-11-01 41 views
30

Tôi có cơ sở dữ liệu thử nghiệm này, bây giờ, được nhồi bằng rác. Bây giờ tôi đã thực hiện một vài lệnh Table.destroy_all trong bảng điều khiển đường ray để xóa tất cả các bản ghi và các phụ thuộc tuyệt vời. Tuy nhiên; Tôi muốn cắt ngắn tất cả mọi thứ để ID của vv bắt đầu tại 1 lần nữa. Có cách nào trong Rails 3 không?Bàn cắt ngắn với bảng điều khiển đường ray

Trả lời

104

Câu trả lời được chấp nhận chỉ hoạt động nếu bạn cần phải tạo lại toàn bộ cơ sở dữ liệu.
Để thả một bảng duy nhất (với callbacks) và để có được ID để bắt đầu từ 1:

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

Nếu bạn đang sử dụng Sqlite, nó không hỗ trợ cắt xén nên làm như sau:

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}'") 
+2

Câu trả lời của bạn là chính xác khi một bảng phải được cắt ngắn (Và tôi cảm ơn bạn vì điều đó) Tôi đã chọn câu trả lời của Yam Marcovic là câu trả lời được chấp nhận bởi vì tôi đã yêu cầu "mọi thứ" bị cắt ngắn. – CaptainCarl

+4

Cảm ơn bạn đã bỏ phiếu. Toàn bộ yêu cầu db không rõ ràng từ câu hỏi!Chỉ cần cho thông tin, rake db: drop sẽ thả cơ sở dữ liệu. Nếu yêu cầu là chỉ cắt ngắn tất cả các bảng, bạn có thể chạy ActiveRecord :: Base.connection.tables.collect {| table_name | ActiveRecord :: Base.connection.execute ("TRUNCATE # {table_name}")}. Mặc dù nó có thể không chăm sóc các cuộc gọi lại, tôi đoán nó là không cần thiết vì chúng tôi đang cắt ngắn tất cả các bảng. –

+0

destroy_all sẽ gọi hủy trên mỗi bản ghi, điều này hoàn toàn khác với việc cắt bớt bảng. Từ Tài liệu: # Phá hủy các bản ghi khớp với + điều kiện + bằng cách khởi tạo mỗi # bản ghi và gọi phương thức + hủy + của nó. Mỗi callbacks của đối tượng là # được thực thi (bao gồm : phụ thuộc tùy chọn kết hợp và # + before_destroy +/+ after_destroy + Phương thức quan sát). Trả về # bộ sưu tập các đối tượng đã bị hủy; mỗi mục sẽ được cố định, để # phản ánh rằng không có thay đổi nào được thực hiện (vì chúng không thể là # vẫn tồn tại). – justingordon

3

Đơn giản chỉ cần xây dựng lại cơ sở dữ liệu trong lần chạy thử tiếp theo (điều này sẽ xảy ra tự động sau khi thả nó).

rake db:drop RAILS_ENV=test

3

Bạn cũng có thể làm rake db:rollback STEP=3 RAILS_ENV=test

trong đó 3 thể hiện số lượng di chuyển bạn có trong db/di chuyển. Ví dụ: Nếu tôi có trong

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

Vì vậy, tôi có tổng cộng 5 lần di chuyển để xóa. Nếu tôi làm rake db:rollback STEP=5 RAILS_ENV=test tất cả các bảng sẽ được thả từ cơ sở dữ liệu TEST của tôi và nếu tôi xóa RAILS_ENV = kiểm tra thì tất cả các bảng ENVIRONNMENT (sản xuất, thử nghiệm, phát triển) sẽ bị xóa và nó cũng làm sạch tệp db/shema.rb. .

2

rake db:reset sẽ thực hiện rake db:drop db:setup. Nói cách khác, hãy thả cơ sở dữ liệu và thiết lập lại cơ sở dữ liệu.

Source

+0

bằng cách làm điều này, chúng ta sẽ mất DATA quan trọng, rất không được khuyến khích. –

0

(Một chút muộn để bên, tôi biết)

Yêu cầu để làm điều này trong bảng điều khiển

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

Làm việc cũng ...

này về cơ bản lặp qua tất cả các bài viết và phá hủy chúng. Nó không thay đổi giá trị thặng dư tự động của bạn mặc dù ...

Cùng logic nên làm việc cho Rails 3 cũng (mặc dù tôi đang sử dụng Rails 4)

+2

1. Không sử dụng 'each', sử dụng' find_each'. Nó đảm bảo bạn sẽ không nhận được một tỷ bản ghi trong một truy vấn 2. Không sử dụng vòng lặp, nếu bạn chỉ cần xóa các bản ghi từ DB (mà không cần chạy bất kỳ cuộc gọi lại nào). Chỉ cần làm 'Post.delete_all' – Kukunin

4

này làm việc cho tôi >>> ActiveRecord :: Base. connection.execute ("TRUNCATE tên_bảng")

1

Giả sử bạn đang sử dụng MySQL hoặc Postgre và không sqlite3 (mà không hỗ trợ TRUNCATE), bạn có thể làm như sau:

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

Lưu ý rằng điều này sẽ không gọi ActiveRec callbacks thứ tự.

Các vấn đề liên quan