একটি ডাটাবেস সারণীতে সমস্ত রেকর্ড মুছে ফেলা হচ্ছে


উত্তর:


249

আপনি যদি এসকিউএল ছাড়াই এর কোনও উপায় খুঁজছেন তবে আপনার মুছুন_আল ব্যবহার করা উচিত।

Post.delete_all

বা একটি মানদণ্ড সহ

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

আরও তথ্যের জন্য এখানে দেখুন ।

রেকর্ডগুলি প্রথমে এগুলি লোড না করে মুছে ফেলা হয় যা এটি খুব দ্রুত করে তোলে তবে এটি কাউন্টারের ক্যাশের মতো কার্যকারিতা ভেঙে ফেলবে যা মুছে ফেলার পরে রেল কোডের উপর নির্ভর করে।


13
এটি লক্ষণীয় যে আপনি যদি এর সাথে সংযুক্তি পেয়ে থাকেন: নির্ভরশীল>> ধ্বংস, বা মুছে ফেলার পরে যে কোনও জিনিস পরিষ্কার করা দরকার, আপনি সম্ভবত পোস্ট.ডেস্ট্রয়_ সবই চাইবেন - যদিও এটি অনেক ধীর। Apidock.com/rails/AtivetiveRecord/Base/destroy_all/class
মাইকেল হেলেন

এই উত্তরটি ধরে নিয়েছে যে টেবিলটির সাথে একটি মডেল যুক্ত রয়েছে। ওপি এটি নির্দিষ্ট করে নি - টেবিলটি একটি যুক্ত টেবিল হলে কী হবে?
টবি 1 কেনবি

1
@ ব্র্যাড ওয়ার্থ এটিকে ভাল বা খারাপ স্টাইল হিসাবে বিবেচনা করছেন বা না করুন, আমি কেবল এটিই বলছি যে একটি রেলস ডিবিতে টেবিল রয়েছে যা ActiveRecordমডেল নয় । প্রশ্নটি একটি 'টেবিল' থেকে রেকর্ড মুছে ফেলার বিষয়ে জিজ্ঞাসা করে এবং আমি কেবল পয়েন্ট করছি বা উত্তরে ধারণ করা অনুমান।
টবি 1 কেনোবি

আমার কাছে টোবি 1 কেনোবি'র মতো প্রশ্ন রয়েছে।
nbsamar

30

এসকিউএল মাধ্যমে মুছতে

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যখনই আপনাকে কোনও ব্লকের অভ্যন্তরে যদি ইফ এক্সপ্রেশনটি ব্যবহার করার প্রয়োজন হয় তবে পছন্দ করুন , এভাবে নীল উপাদানগুলি সরিয়ে ফেলতে আপনি কমপ্যাক্ট পদ্ধতিতে শৃঙ্খলাবদ্ধ হওয়া এড়ান।
সেবাস্তিয়ান পালমা

4
BlogPost.find_each(&:destroy)

স্বল্প স্মৃতির পরিস্থিতিতে এটি দুর্দান্ত।
এপিজিন

এই একমাত্র উত্তর যা মেমরির খরচ গ্রহণ করে।
জন

2
ওম, কেন এই জন্য একটি লুপ করা ... বুদ্ধি নেই। কেবল সমস্ত রেকর্ড মুছে ফেলুন টেবিল থেকে, Model.delete_all
ইমনল

@ জন কেন একটি একক ক্যোয়ারী প্রশ্নের লুপের চেয়ে বেশি মেমরি গ্রহণ করে?
ইমনল

@ ইমনল প্রতিটি পুনরাবৃত্তি প্রশ্নে মডেলটির একটি নতুন উদাহরণ ইনস্ট্যান্ট করে যাতে এটি মোছার পদ্ধতির কলব্যাকগুলি প্রক্রিয়া করতে পারে।
জন

2

যদি আপনার মডেলটিকে ব্লগপোস্ট বলা হয় তবে এটি হবে:

BlogPost.all.map(&:destroy)

এটি প্রতিটি ব্লগপোস্ট আনবে এবং এগুলি ধ্বংস করার আগে এটি রুবি অ্যারেতে লোড করবে।
hdgarrood

ওআরএম নির্ভর করে। আপনি প্রতিটি মডেল সম্পর্কে কোনও অনুরোধ করছেন না বলে ডেটাাম্পার এটি করবে না। এবং এখানে একটি মঙ্গয়েড স্ট্যাকট্রিজ রয়েছে যা দেখায় যে এটি প্রতিটি এন্ট্রি নষ্ট করার আগে কোনও ক্ষেত্র নির্বাচন করে না: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)
স্টেফ

4
যেহেতু এটি রেলের প্রশ্ন, এবং প্রশ্নকর্তা তিনি কোন ওআরএম ব্যবহার করছেন তা বলেননি, আমাদের উচিত অ্যাক্টিভেকর্ড
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পারি এবং আমরা delete_allসমস্ত মডেলগুলিতে একটি প্রয়োগ করতে পারি ।

নোট করুন যে আমরা স্কিমা অভিবাসন টেবিলটি সাফ না করার বিষয়টি নিশ্চিত করেছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.