محتويات الدورة

SQLite / المتقدم: التزامن والاسترداد وحدود التطبيق / الدرس 16

تطوير المخطط وعقود الترحيل

خطط لتغييرات مخطط SQLite مع تحديد التوافق صراحة، وفحص البيانات، وحفظ الاعتمادات، وملكية المعاملة، وإصدارات تطبيق يمكن استعادتها.

وقت القراءة التقريبي: 5 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • استخدام عمليات ALTER التي يدعمها إصدار التشغيل المختبر.
  • شرح الحالات التي تحتاج إعادة بناء جدول وفق خطة مراجعة.
  • تمييز بيانات user_version الوصفية من الدليل على صحة الترحيل.

يغير الترحيل عقداً من عقود التطبيق

يؤثر تغيير المخطط في الصفوف والفهارس والمشغلات وطرق العرض والعبارات المحضرة، وفي كل قارئ وكاتب مدعوم. سجل الإصدار الابتدائي والهدف ونافذة التوافق والتحقق والاستعادة. لا تثبت قاعدة اختبار فارغة صحة ترحيل يجب أن يعالج قيماً وعلاقات متراكمة منذ سنوات؛ بل يجب أن تمثل الاختبارات تاريخ البيانات الحقيقي.

يدعم SQLite عمليات محددة من ALTER TABLE، لا كل صيغ قواعد بيانات الخادم. يتيح الخط 3.45.1 إضافة العمود وإعادة التسمية المعروضتين، وقد تصف الوثائق الحالية ميزات أحدث لا يملكها. تحقق من دعم البيئة المنشورة قبل الطرح، خصوصاً مع تطبيقات الهاتف وسطح المكتب التي قد تحتفظ بمكتبات مضمّنة قديمة.

اختر قيمة افتراضية متوافقة بقصد واضح

يضيف البرنامج الأول عمود عملة إلزامياً بقيمة افتراضية صريحة إلى دفتر مصطنع. تُقرأ الصفوف السابقة بعملة USD، وتضبط user_version داخل معاملة الترحيل فقط. تحمل القيمة معنى تجارياً، ولا تعالج كل عملة مجهولة؛ فقد تحتاج البيانات التاريخية استكمالاً مراجعاً أو رفضاً، لا قيمة واحدة مخمّنة.

تقيّد ADD COLUMN القيم الافتراضية والقيود، وقد تتطلب بعض الإضافات فحص البيانات السابقة. لا تفترض فورية كل ALTER أو صحتها لبساطة العمود؛ اختبر العملية وسجلات قديمة ممثلة على نسخة. ليست schema_version التابعة للمحرك سجل ترحيل يعدله التطبيق عرضاً، بينما user_version بيانات يملكها التطبيق ويلزمه التحقق منها.

sql إضافة عمود بإصدار صريح
CREATE TABLE ledger(id INTEGER PRIMARY KEY,amount INTEGER NOT NULL);
INSERT INTO ledger VALUES(1,20);
BEGIN;
ALTER TABLE ledger ADD COLUMN currency TEXT NOT NULL DEFAULT 'USD';
PRAGMA user_version=1;
COMMIT;
SELECT id,amount,currency FROM ledger ORDER BY id;
PRAGMA user_version;
الناتج المتوقع
id|amount|currency
1|20|USD

user_version
1

يُقرأ الصف الموجود بالعملة الافتراضية المعلنة، وتبلغ بيانات التطبيق الوصفية الإصدار 1. لا يثبت هذا الرقم وحده صحة المخطط.

حدد نطاق إعادة البناء بدلاً من نسخ خطوات آلية

تحتاج بعض تغييرات القيود أو التخطيط إجراء إعادة البناء العام الموثق في SQLite. يقتصر البرنامج الثاني عمداً على جدول معزول بلا اعتمادات مفاتيح أجنبية أو مشغلات مخصصة أو طرق عرض أو فهارس ثانوية. ينسخ الصفوف الصحيحة لبنية مقيدة ويعيد تسميتها بمعاملة واحدة؛ وليس وصفة كاملة لأي مخطط اعتباطي.

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

sql إعادة بناء معزولة من الاعتمادات عمداً
CREATE TABLE invoice(id INTEGER PRIMARY KEY,cents INTEGER);
INSERT INTO invoice VALUES(1,100),(2,200);
BEGIN;
CREATE TABLE invoice_new(id INTEGER PRIMARY KEY,cents INTEGER NOT NULL CHECK(cents>=0),currency TEXT NOT NULL);
INSERT INTO invoice_new SELECT id,cents,'USD' FROM invoice;
DROP TABLE invoice;
ALTER TABLE invoice_new RENAME TO invoice;
PRAGMA user_version=2;
COMMIT;
SELECT COUNT(*) AS rows,SUM(cents) AS total FROM invoice;
PRAGMA integrity_check;
الناتج المتوقع
rows|total
2|300

integrity_check
ok

يبقى الصفان ومجموع 300 سنت بعد إعادة البناء المقيدة، ويعيد فحص السلامة المعزول النتيجة ok.

خطط لتعايش الإصدارات والتعافي من الفشل

قد يشارك التطبيق الجديد قارئاً أقدم الملف أثناء الطرح. حدد المخطط المفهوم لكل إصدار وتوافق الكتابة. قد ينجح الترحيل محلياً ويعطل الأقدم باستخدام STRICT أو JSONB أو إعادة تسمية الأعمدة أو تغيير القيود. يجب أن يتحقق قبول الإصدار من قدراته الفعلية، لا اسم إصدار التطبيق التسويقي فقط.

لاستكمال كبير، حدد نقاط التقدم وأحجام المعاملات وهوية الاستئناف وظهور الحالة الجزئية. ليست الدفعات الملتزمة ترحيلاً ذرياً واحداً إلا إذا فهم التطبيق الحالات الوسيطة. اختبر الفشل قبل النسخ وبعده وقبل التسمية وبعد الالتزام. استعد بنسخة معلومة السلامة أو خطة عكس مراجعة، لا تحرير sqlite_schema ارتجالياً بـ writable_schema.

تحقق من البيانات والاعتمادات ودليل الإصدار

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

سجل مصدر الترحيل وهوية أثره وحدد الإعادة: ارفض إصدار بداية غير متوقع أو استأنف انقطاعاً موثقاً. قد يخفي تجاهل كل خطأ «موجود بالفعل» مخططاً جزئياً أو مختلفاً. التطوير الموثوق انتقال متحقق منه يمكن تفسير أثره في البيانات والتوافق، لا قائمة DDL صادف أنها لم ترفع خطأ.

الأخطاء الشائعة وإصلاحها

لا يستطيع تطبيق أقدم فتح الملف بعد ترحيله.

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

فقد جدول أعيد بناؤه فهرساً أو مشغلاً مهماً.

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

تعلن user_version الاكتمال بينما المخطط جزئي.

لماذا يحدث؟
قُدمت البيانات الوصفية مستقلة عن التحقق من الترحيل.
كيف تصلحه؟
أصلح الحالة بإجراء مراجع يراعي وضعها، وتحقق من الكائنات والبيانات الفعلية.
كيف تتجنب تكراره؟
التزم بالعلامة والترحيل المتحقق منه معاً.

اختبر فهمك

1. لماذا لا تكون إضافة currency DEFAULT USD صحيحة تلقائياً للصفوف التاريخية مجهولة العملة؟

اعرض الحل المشروح

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

2. ما الذي يجب فحصه بعد إعادة بناء جدول، إلى جانب عدد الصفوف؟

اعرض الحل المشروح

افحص ثبات المفاتيح والقيم والمجاميع الرقابية، والسماح بالقيم الفارغة وسلوك CHECK وUNIQUE، واتساق المفاتيح الأجنبية، والفهارس والمشغلات وطرق العرض التابعة، وتوافق بيئة التشغيل، واستعلامات تطبيق ممثلة. فقد يصح العدد مع علاقات خاطئة أو قيود مفقودة أو قراء عاجزين عن الاستخدام.

أهم ما تعلمته

  • تغيير المخطط انتقال في التوافق والبيانات.
  • تحتاج أمثلة إعادة البناء حدود اعتماد صريحة.
  • يفيد عدد الإصدار بوصفه بيانات وصفية، لكنه لا يثبت بنفسه نجاح الترحيل.

المراجع الرسمية