هي بذر البيانات مع تركيبات خطرة في روبي على القضبان
-
13-09-2019 - |
سؤال
لدي تركيبات مع البيانات الأولية التي تحتاج إلى الإقامة في قاعدة البيانات الخاصة بي (البلدان والمناطق والناقلات وما إلى ذلك). لدي مهمة أشعل النار 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.
لقد قمنا ببناء مجموعة من أفضل الممارسات التي نستخدمها لبيانات البذر. نعتمد اعتمادا كبيرا على البذر، ولدينا بعض المتطلبات الفريدة لأننا بحاجة إلى أنظمة البذور متعددة المستأجرين. إليك بعض أفضل الممارسات التي استخدمناها:
- المباريات ليست أفضل حل، لكنك ما زلت يجب أن تخزن بيانات البذور الخاصة بك في شيء آخر غير روبي. يميل رمز Ruby لتخزين بيانات SEED إلى الحصول على تسديدة، وتخزين البيانات في ملف تمويل يعني أنه يمكنك كتابة رمز عام للتعامل مع البذور الخاصة بك بطريقة متسقة.
- إذا كنت ستقوم بتحديث البذور، فاستخدم عمود علامة يدعى شيئا مثل
code
لتتناسب مع ملف البذور الخاص بك إلى البيانات الفعلية الخاصة بك. لا تعتمد أبدا على معرفات كونها متسقة بين البيئات. - فكر في الطريقة التي تريد التعامل مع تحديث بيانات البذور الموجودة. هل هناك أي إمكانات قام المستخدمون بتعديل هذه البيانات؟ إذا كان الأمر كذلك، يجب عليك الحفاظ على معلومات المستخدم بدلا من تجاوزه مع بيانات البذور؟
إذا كنت مهتما ببعض الطرق التي نقوم بها البذر، فقد حزمناها في جوهرة تسمى 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
هذا من شأنه أن يسمح لك بتشغيل الهجرة والبذور في أمر من شأنه أن يسمح لهم بالتعايش أكثر بصريا.
خواطر؟