การลบระเบียนทั้งหมดในตารางฐานข้อมูล


คำตอบ:


249

หากคุณกำลังมองหาวิธีการโดยไม่มี SQL คุณควรจะสามารถใช้ delete_all ได้

Post.delete_all

หรือด้วยเกณฑ์

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

ดูที่นี่สำหรับข้อมูลเพิ่มเติม

บันทึกจะถูกลบโดยไม่ต้องโหลดก่อนซึ่งทำให้เร็วมาก แต่จะทำลายฟังก์ชันการทำงานเช่นแคชตัวนับซึ่งขึ้นอยู่กับรหัสรางที่จะดำเนินการเมื่อลบ


13
เป็นที่น่าสังเกตว่าหากคุณมีความเชื่อมโยงกับ: depend =>: destroy หรืออะไรก็ตามที่ต้องล้างข้อมูลเมื่อลบออกคุณอาจต้องการ Post.destroy_all - แม้ว่าจะช้ากว่ามากก็ตาม ดูapidock.com/rails/ActiveRecord/Base/destroy_all/class
Michael Hellein

คำตอบนี้ถือว่าตารางมีโมเดลที่เกี่ยวข้อง OP ไม่ได้ระบุสิ่งนี้ - จะเกิดอะไรขึ้นถ้าตารางนั้นเป็นตารางรวม?
Toby 1 Kenobi

1
@BradWerth ไม่ว่าบางคนจะพิจารณาว่าเป็นรูปแบบที่ดีหรือไม่ดีฉันแค่บอกว่าเป็นไปได้ที่ Rails db มีตารางที่ไม่ใช่ActiveRecordแบบจำลอง คำถามถามเกี่ยวกับการลบบันทึกจาก 'ตาราง' และฉันแค่ชี้หรือสมมติฐานที่อยู่ในคำตอบ
Toby 1 Kenobi

ฉันมีคำถามเดียวกันกับ @ Toby1Kenobi
nbsamar

30

เพื่อลบผ่าน SQL

Item.delete_all # accepts optional conditions

ในการลบโดยเรียกเมธอดการทำลายของแต่ละรุ่น (มีราคาแพง แต่เรียกการเรียกกลับ)

Item.destroy_all # accepts optional conditions

ทั้งหมดที่นี่


21

หากคุณต้องการล้างฐานข้อมูลทั้งหมดและไม่เพียง แต่ลบโมเดลหรือโมเดลที่แนบมาเท่านั้นคุณสามารถทำได้:

rake db:purge

คุณสามารถทำได้บนฐานข้อมูลทดสอบ

rake db:test:purge

5

ถ้าคุณหมายถึงลบทุกอินสแตนซ์ของทุกรุ่นฉันจะใช้

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

1
ต้องการselectเมื่อใดก็ตามที่คุณต้องการใช้นิพจน์ if ภายในบล็อกวิธีนี้จะช่วยให้คุณไม่ต้องเชื่อมโยงวิธีการกระชับเพื่อลบองค์ประกอบศูนย์
Sebastian Palma

4
BlogPost.find_each(&:destroy)

เหมาะสำหรับสถานการณ์หน่วยความจำต่ำ
Epigene

นี่เป็นคำตอบเดียวที่คำนึงถึงการใช้หน่วยความจำ
จอห์

2
Omg ทำไมต้องวนซ้ำสำหรับสิ่งนี้ ... เพียงแค่ลบบันทึกทั้งหมด DELETE FROM ตาราง Model.delete_all
Imnl

@ จอห์นเหตุใดแบบสอบถามเดียวจึงใช้หน่วยความจำมากกว่าแบบสอบถามวนซ้ำ
Imnl

@Imnl การวนซ้ำแต่ละครั้งจะสร้างอินสแตนซ์ใหม่ของโมเดลที่เป็นปัญหาเพื่อให้สามารถประมวลผลการเรียกกลับสำหรับวิธีการลบ
John

2

หากโมเดลของคุณเรียกว่า BlogPost มันจะเป็น:

BlogPost.all.map(&:destroy)

สิ่งนี้จะดึงข้อมูล BlogPost ทุกรายการและโหลดลงในอาร์เรย์ Ruby ก่อนที่จะทำลายทิ้ง
hdgarrood

ขึ้นอยู่กับ ORM. Datamapper จะไม่ทำเช่นนั้นเนื่องจากคุณไม่ได้ร้องขออะไรเกี่ยวกับแต่ละรุ่น และนี่คือ Mongoid stacktrace ที่แสดงว่าไม่ได้เลือกฟิลด์ใด ๆ ก่อนที่จะทำลายแต่ละรายการ: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
เนื่องจากเป็นคำถามทางรถไฟและผู้ถามไม่ได้บอกว่าเขาใช้ ORM ใดเราควรถือว่า ActiveRecord
hdgarrood

2

คำตอบล่าสุดในกรณีที่คุณต้องการลบทุกรายการในทุกตาราง:

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

ข้อมูลเพิ่มเติมเกี่ยวกับที่นี่eager_load

หลังจากเรียกมันแล้วเราสามารถเข้าถึงผู้สืบทอดทั้งหมดActiveRecord::Baseและเราสามารถใช้ a delete_allกับทุกรุ่นได้

โปรดทราบว่าเราไม่ได้ล้างตาราง SchemaMigration

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.