تطوير تطبيق ما لا يعني فقط تنفيذ وظائف جديدة أو تصحيحه. في بعض الأحيان يتعين عليك عكس التغييرات والعودة إلى المرحلة السابقة من المشروع. هناك مشكلة متكررة يمكن أن تظهر أثناء العمل على فروع متعددة مرتبطة بالحفاظ على الإصدار المناسب من بنية قاعدة البيانات. المبرمجون، الذين يستخدمون القضبان، لديهم حلول جاهزة تحت تصرفهم. تدعم هذه الحلول تنفيذ تغييرات قاعدة البيانات والتحكم فيها - هذه هي عمليات الترحيل. لن أصف كيف تعمل وما هي الإمكانيات التي تجلبها - أود التركيز على مشكلة الحفاظ على الإصدار المناسب من بنية قاعدة البيانات أثناء تبديل الفروع.
تعد طبقة قاعدة البيانات في التطبيق كائنًا منفصلاً ولا يتم التحكم فيها إلا من خلال عمليات الترحيل. أثناء إنشاء عمليات ترحيل جديدة، تذكر أن تجعل التحويل المخطط لهيكل قاعدة البيانات قابلاً للعكس. بالطبع، في الحالات القصوى، يمكننا رفع هجرة لا رجعة فيها
في لأسفل الطريقة. سيُعلمنا هذا أيضًا بحقيقة أنه لا يمكن عكس عملية الترحيل. هناك أنواع مختلفة من التغييرات التي نقوم بها في الترحيل - إنشاء وتعديل وإزالة الجداول أو الأعمدة أو الفهارس. عمليات الحذف والتعديل هي الأكثر حساسية للتغيير. لماذا؟ لننظر إلى السيناريو التالي:نحن نعمل مع الفرع الرئيسي، وهو مسار عملنا الرئيسي. لدينا حاليًا جدول واحد:
فئة إنشاء مقالات <أكتيف ريكورد::الترحيل
تعريف التغيير
إنشاء_جدول :مقالات do |t|
ر.سلسلة :اسم
t.text :الوصف
سلسلة t.string :الحالة، فارغة: خطأ
t.timestamps فارغة: خطأ
النهاية
النهاية
النهاية
لدينا المادة
يحتوي النموذج على مثل هذه التحققات التي تتطلب وجود الاسم, الوصف و الحالة السمات.
فئة المادة <أكتيف ريكورد::قاعدة
التحقق من صحة :الاسم، التواجد: صحيح
التحقق من صحة :الوصف، التواجد: صحيح
يتحقق من صحة :الحالة، التواجد: صحيح
ينتهي
نحن ننفذ تغييرات في المقالات الجدول على الميزة فرع التطوير ونحذف فرع التطوير ونحذف الحالة العمود.
فئة RemoveStatusColumnFolumnFromArticles < ActiveRecord::Migration
تعريف التغيير
إزالة_العمود :مقالات، :الحالة، :سلسلة
نهاية
النهاية
نحن ننفذ عملية الترحيل:
$ [مثال/ميزات]: حزمة تنفيذ أشعل النار أشعل النار في قاعدة البيانات: ترحيل
== 20150605120955 RemoveStatusColumnColumnFromArticles: الترحيل ===================
-- إزالة_العمود(:مقالات، :الحالة، :سلسلة)
-> 0.0717s
= == 20150605120955 RemoveStatusColumnColumnFromArticles: تم الترحيل (0.0718 ثانية) ==========
يتغير مخطط قاعدة البيانات:
الفرق --الجيت a/db/schema.rb b/db/schema.rb
الفهرس 2a100a9..76438c1 100644 - a/db/schema.rb +++ b/db/schema.rb @@@ -11,14 +11,13 @@ #
يوصى بشدة أن تسجل هذا الملف في نظام التحكم في الإصدار الخاص بك.
-ActiveRecord::Schema.defined(الإصدار: 20150605120350) do
+ActiveRecord::Schema.definition(الإصدار: 20150605120955) do
إنشاء جدول "مقالات"، فرض: :cascade do |t|
t.string "الاسم"
t.text "الوصف"
- t.string "الحالة"، فارغة: خطأ t.datetime "createat"، فارغة: خطأ
t.datetime "تم التحديث"، فارغ: خطأ
النهاية
نهاية
بعد ذلك، نقوم بإجراء التغييرات على الميزة الفرع. لمحاكاة هذه المشكلة نقوم بتبديل الفرع الحالي إلى الرئيسي. تم تغيير البنية الأساسية عن طريق الترحيل، مما يؤدي إلى حذف الحالة في العمود الميزة الفرع. دعونا نحاول استخدام الأمر التالي:
Article.create!(الاسم: "كابوم"، الوصف: "Lorem ipsum..."، الحالة: "نشط")
ماذا سيحدث بعد تنفيذ ما ذكر أعلاه الكود? الخطأ ActiveRecord::UnknownAttributeError: سمة غير معروفة "الحالة" للمادة
سيتم رفعه وذلك بسبب عدم توافق نسخة البنية غير المتوافقة لقاعدة البيانات. قبل تغيير الفرع إلى الرئيسي يجب علينا التراجع عن الترحيل الذي يحذف الحالة من العمود من المادة الجدول.
ما الذي يمكننا فعله للتحقق مما إذا كان علينا التراجع عن بعض عمليات الترحيل قبل تبديل الفروع؟ مع استخدام نظام التحكم في الإصدار (هنا هو git) يمكننا التحقق من عملنا من خلال إنشاء اسم مستعار مفيد:
~/.gitconfig
[الاسم المستعار]
migrations = "!f() { git diff --الاسم فقط $1...$2 db/migrate | tr -d "[A-Za-z/..."؛ }؛ f"
تنفيذ ميزة ترحيلات git الرئيسية
سينتج عن الأمر قائمة بإصدارات الترحيل، الموجودة في الميزة الفروع، والتي لا يمكن العثور عليها في سيد.
$ [مثال/ميزة]: ميزة الترحيلات الرئيسية لـ git
20150605120955
وبفضل هذه المعلومات يمكننا بسهولة استرجاع التغييرات التي تم إجراؤها في بنية قاعدة البيانات قبل التبديل إلى الرئيسي.
$ [مثال/ميزات]: حزمة تنفيذ أشعل النار أشعل النار في قاعدة البيانات:migrate:down VERSION=20150605120955
== 20150605120955 RemoveStatusColumnColumnFromArticles: الرجوع ===================
-- إضافة_عمود(:مقالات، :الحالة، :سلسلة)
-> 0.0009s
= == 20150605120955 RemoveStatusColumnColumnFromArticles: تمت الإعادة (0.0045 ثانية) ==========
هناك شيء آخر يجب أن نفعله بعد إعادة الترحيل وهو استعادة حالة مخطط قاعدة البيانات.
$ [مثال/ميزة]: حالة git
في ميزة الفرع
تغييرات لم يتم تنظيمها للالتزام:
(استخدم "git add ..." لتحديث ما سيتم الالتزام به)
(استخدم "git checkout -- ..." لتجاهل التغييرات في دليل العمل)
تم تعديل: db/schema.rb
لا توجد تغييرات مضافة إلى الالتزام (استخدم "git add" و/أو "git commit -a")
$ [مثال/خاصية]: git checkout db/schema.rb
$ [مثال/ميزة]: حالة git
في ميزة الفرع
لا شيء للالتزام، دليل العمل نظيف
يمكننا الآن التبديل بسهولة إلى سيد الفرع.
المثال المعطى ليس مشكلة معقدة للحل، لكنه يجب أن يساعدك على إدراك مدى أهمية الحفاظ على بنية قاعدة البيانات أثناء التغيير في سياق العمل.