Xóa tất cả các bản ghi trong bảng cơ sở dữ liệu


Câu trả lời:


249

Nếu bạn đang tìm cách để không có SQL, bạn có thể sử dụng xóa_all.

Post.delete_all

hoặc với một tiêu chí

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

Xem ở đây để biết thêm thông tin.

Các bản ghi sẽ bị xóa mà không tải chúng trước, điều này làm cho nó rất nhanh nhưng sẽ phá vỡ chức năng như bộ đệm bộ đệm phụ thuộc vào mã đường ray được thực thi khi xóa.


13
Điều đáng chú ý là nếu bạn có các liên kết với: lệ thuộc =>: phá hủy hoặc bất cứ thứ gì cần được dọn sạch khi xóa, có thể bạn sẽ muốn Post.destroy_all - mặc dù nó chậm hơn nhiều. Xem apidock.com/rails/ActiveRecord/Base/destroy_all/ class
Michael Hellein

Câu trả lời này giả định rằng bảng có một mô hình liên quan đến nó. OP không chỉ định điều này - nếu bảng là bảng tham gia thì sao?
Toby 1 Kenobi

1
@BradWerth dù được một số người coi là phong cách tốt hay xấu, tôi chỉ nói rằng khả năng một Rails db có các bảng không phải là ActiveRecordmô hình. Câu hỏi hỏi về việc xóa bản ghi khỏi 'bảng' và tôi chỉ chỉ hoặc giả định được giữ trong câu trả lời.
Toby 1 Kenobi

Tôi có cùng truy vấn với @ Toby1Kenobi.
nbsamar

30

Để xóa qua SQL

Item.delete_all # accepts optional conditions

Để xóa bằng cách gọi phương thức hủy của mỗi mô hình (đắt tiền nhưng đảm bảo gọi lại được gọi)

Item.destroy_all # accepts optional conditions

Tất cả ở đây


21

nếu bạn muốn làm trống hoàn toàn cơ sở dữ liệu và không chỉ xóa một mô hình hoặc mô hình được đính kèm với nó, bạn có thể làm:

rake db:purge

bạn cũng có thể làm điều đó trên cơ sở dữ liệu thử nghiệm

rake db:test:purge

5

Nếu bạn có nghĩa là xóa mọi phiên bản của tất cả các mô hình, tôi sẽ sử dụng

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)

1
Thích selectbất cứ khi nào bạn cần sử dụng biểu thức if bên trong một khối, theo cách này bạn tránh phải xâu chuỗi phương thức rút gọn để loại bỏ các phần tử không.
Sebastian Palma

4
BlogPost.find_each(&:destroy)

Điều này là tuyệt vời cho các trường hợp bộ nhớ thấp.
Epigene 10/2/2015

Đây là câu trả lời duy nhất đưa mức tiêu thụ bộ nhớ vào tài khoản.
John

2
Ôi, tại sao phải tạo một vòng lặp cho việc này ... không có ý nghĩa. chỉ cần xóa tất cả các bản ghi XÓA TỪ bảng, Model.delete_all
Imnl

@ John tại sao một truy vấn duy nhất tiêu tốn nhiều bộ nhớ hơn một vòng truy vấn?
Imnl

@Imnl Mỗi lần lặp lại khởi tạo một thể hiện mới của mô hình được đề cập để nó có thể xử lý các cuộc gọi lại cho phương thức xóa.
John

2

Nếu mô hình của bạn được gọi là BlogPost, nó sẽ là:

BlogPost.all.map(&:destroy)

điều này sẽ tìm nạp mọi BlogPost duy nhất và tải nó vào một mảng Ruby trước khi phá hủy chúng.
hdgarrood

Phụ thuộc vào ORM. Datamapper sẽ không làm điều đó bởi vì bạn không yêu cầu bất cứ điều gì về mỗi mô hình. Và đây là một ngăn xếp Mongoid cho thấy nó không chọn bất kỳ trường nào trước khi phá hủy mỗi mục:MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
stef

4
vì đó là một câu hỏi khó hiểu và người hỏi không nói anh ấy đang sử dụng ORM nào, chúng tôi nên giả sử ActiveRecord
hdgarrood

2

Câu trả lời gần đây hơn trong trường hợp bạn muốn xóa mọi mục trong mỗi bảng:

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

Thêm thông tin về eager_load đây .

Sau khi gọi nó, chúng ta có thể truy cập vào tất cả các hậu duệ ActiveRecord::Basevà chúng ta có thể áp dụng một delete_alltrên tất cả các mô hình.

Lưu ý rằng chúng tôi đảm bảo không xóa bảng SchemaMigration.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.