هي بذر البيانات مع تركيبات خطرة في روبي على القضبان

StackOverflow https://stackoverflow.com/questions/984479

سؤال

لدي تركيبات مع البيانات الأولية التي تحتاج إلى الإقامة في قاعدة البيانات الخاصة بي (البلدان والمناطق والناقلات وما إلى ذلك). لدي مهمة أشعل النار DB: البذور التي سوف البذور قاعدة بيانات.

namespace :db do
  desc "Load seed fixtures (from db/fixtures) into the current environment's database." 
  task :seed => :environment do
    require 'active_record/fixtures'

    Dir.glob(RAILS_ROOT + '/db/fixtures/yamls/*.yml').each do |file|
      Fixtures.create_fixtures('db/fixtures/yamls', File.basename(file, '.*'))
    end
  end
end

أنا قلق بعض الشيء لأن هذه المهمة تمسح قاعدة البيانات الخاصة بي نظف وتحميل البيانات الأولية. حقيقة أن هذا ممكن أن تفعل أكثر من مرة في الإنتاج يخيف حماقة مني. هل هذا طبيعي وهل يجب أن أكون حذرا؟ أو هل يحمي الناس عادة مهمة مثل هذا بطريقة ما؟

هل كانت مفيدة؟

المحلول

بيانات البذر مع تركيبات هي فكرة سيئة للغاية.

لا يتم التحقق من صحة المباريات ولأن معظم مطوري القضبان لا يستخدمون قيود قاعدة البيانات وهذا يعني أنه يمكنك بسهولة الحصول على بيانات غير صالحة أو غير كاملة مدرجة في قاعدة بيانات الإنتاج الخاصة بك.

وضع تركيبات أيضا معرفات أساسية أساسية غريبة بشكل افتراضي، وهي ليست مشكلة بالضرورة ولكنها مزعجة للعمل معها.

هناك الكثير من الحلول لهذا. مفضلتي الشخصية هي مهمة أشعل النار تقوم بتشغيل برنامج نصي روبي يستخدم ببساطة activerecord لإدراج السجلات. هذا ما سيفعله القضبان 3 db:seed, ، ولكن يمكنك بسهولة كتابة هذا بنفسك.

أنا أكمل هذا مع طريقة أضيف إلى activerecord :: قاعدة تسمى create_or_update. وبعد باستخدام هذا يمكنني تشغيل البرنامج النصي للبذور عدة مرات، تحديث السجلات القديمة بدلا من رمي استثناء.

كتبت مقالا عن هذه التقنيات لفترة طويلة تحميل بيانات البذور.

نصائح أخرى

للجزء الأول من سؤالك، نعم، سأضع بعض الاحتياطات لتشغيل مهمة مثل هذا في الإنتاج. وضعت حماية مثل هذا في مهمة البنسعة / البذر:

task :exit_or_continue_in_production? do
  if Rails.env.production?
    puts "!!!WARNING!!! This task will DESTROY " +
         "your production database and RESET all " +
         "application settings"
    puts "Continue? y/n"
    continue = STDIN.gets.chomp
    unless continue == 'y'
      puts "Exiting..."
      exit! 
    end
  end
end

لقد أنشأت هذا GIST. لبعض السياق.

للجزء الثاني من السؤال - عادة ما تريد حقا شيئين: أ) يزرع قاعدة البيانات بسهولة جدا وإعداد تطبيق التنمية، و B) bootstraping التطبيق على خادم الإنتاج (مثل: إدراج مستخدم المسؤول، إنشاء تطبيق المجلدات يعتمد على، إلخ).

كنت أستخدم تركيبات البذر في التنمية - ثم يرى الجميع من الفريق نفس البيانات في التطبيق وما هو في التطبيق يتوافق مع ما هو في الاختبارات. (عادة أنا التفاف rake app:bootstrap, rake app:seed rake gems:install, ، إلخ في rake app:install لذلك يمكن للجميع العمل على التطبيق من خلال استنساخ الريبو فقط وتشغيل هذه المهمة واحدة.)

ومع ذلك، لكنني أبدا استخدام تركيبات البذر / Bootstraping على خادم الإنتاج. القضبان db/seed.rb جيد حقا لهذه المهمة، ولكن يمكنك بالطبع وضع نفس المنطق بنفسك rake app:seed المهمة، مثل الآخرين أشار بها.

الحاكام 3 ستحل هذا من أجلك باستخدام ملف seed.rb.

http://github.com/brynary/rails/commit/4932f7b38f72104819022abca0c952ba6f9888cb.

لقد قمنا ببناء مجموعة من أفضل الممارسات التي نستخدمها لبيانات البذر. نعتمد اعتمادا كبيرا على البذر، ولدينا بعض المتطلبات الفريدة لأننا بحاجة إلى أنظمة البذور متعددة المستأجرين. إليك بعض أفضل الممارسات التي استخدمناها:

  1. المباريات ليست أفضل حل، لكنك ما زلت يجب أن تخزن بيانات البذور الخاصة بك في شيء آخر غير روبي. يميل رمز Ruby لتخزين بيانات SEED إلى الحصول على تسديدة، وتخزين البيانات في ملف تمويل يعني أنه يمكنك كتابة رمز عام للتعامل مع البذور الخاصة بك بطريقة متسقة.
  2. إذا كنت ستقوم بتحديث البذور، فاستخدم عمود علامة يدعى شيئا مثل code لتتناسب مع ملف البذور الخاص بك إلى البيانات الفعلية الخاصة بك. لا تعتمد أبدا على معرفات كونها متسقة بين البيئات.
  3. فكر في الطريقة التي تريد التعامل مع تحديث بيانات البذور الموجودة. هل هناك أي إمكانات قام المستخدمون بتعديل هذه البيانات؟ إذا كان الأمر كذلك، يجب عليك الحفاظ على معلومات المستخدم بدلا من تجاوزه مع بيانات البذور؟

إذا كنت مهتما ببعض الطرق التي نقوم بها البذر، فقد حزمناها في جوهرة تسمى seedomatic..

ماذا عن مجرد حذف المهمة خارج خادم الإنتاج بمجرد أن تقوم بتصنيف قاعدة البيانات؟

كان لدي فكرة مثيرة للاهتمام ...

ماذا لو قمت بإنشاء db seeds وأضاف ملفات نمط الترحيل:

ملف: 200907301234_add_us_states.rb.

class AddUsStates < ActiveRecord::Seeds

  def up
    add_to(:states, [
      {:name => 'Wisconsin', :abbreviation => 'WI', :flower => 'someflower'},
      {:name => 'Louisiana', :abbreviation => 'LA', :flower => 'cypress tree'}
      ]
    end
  end

  def down
    remove_from(:states).based_on(:name).with_values('Wisconsin', 'Louisiana', ...)
  end
end

بالتناوب:

  def up
    State.create!( :name => ... )
  end

هذا من شأنه أن يسمح لك بتشغيل الهجرة والبذور في أمر من شأنه أن يسمح لهم بالتعايش أكثر بصريا.

خواطر؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top