SQLite / دليل حلول تحريري

تشخيص الألفة وفشل أنواع STRICT

حدد حد التمثيل وراء الأنواع المختلطة أو رفض النوع أو الحساب المفاجئ دون تحويل التالف صامتاً.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

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

قد تظهر datatype mismatch أو cannot store TEXT value in INTEGER column. احفظ النص الفعلي وسياق العمود، ولا تفترض أن كل رفض عيب في المشغل أو أن إزالة القيد هي الإصلاح الصحيح.

افهم الأسباب المحتملة

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

تتبع القيمة من الإدخال إلى التخزين

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

ميّز الألفة وSTRICT ورفض المجال

الألفة العادية تفضيل تحويل وليست قيد نوع كاملاً. تستخدم STRICT من3.37.0 أسماء مدعومة وقواعد أقوى، وتبقى CHECK وNOT NULL للمجال والمطلوب. ولـINTEGER PRIMARY KEY دلالة هوية لا يملكها كل عمود عددي. تحقق من المخطط الفعلي قبل تعديل المستدعي، ولا تجعل CAST الذي يحول نصاً تالفاً إلى صفر «إصلاحاً»؛ فقد يحول الرفض إلى بيانات تبدو صالحة كذباً.

أعد رفض الكمية وحفظ التسمية بأمان

يدرج البرنامج رمز كمية عددياً صحيحاً في INTEGER داخل STRICT ويحفظ003 في ANY. يرفض الصف الثاني الذي يرسل pear كميةً فلا يزيد عدد الصفوف. يميز ذلك التحويل المقبول من مدخل غير متوافق. يقع العمل في ذاكرة خاصة تُغلق عند الحد، ويعرض النوع مع القيمة بدلاً من التخمين من مظهرها. لا يدعي المثال أن ANY بديل عام عن تحديد معنى كل حقل.

python فحص التخزين المقبول بعد رفض المدخل المخالف
import sqlite3
from contextlib import closing

with closing(sqlite3.connect(":memory:", isolation_level=None)) as db:
    db.execute("CREATE TABLE reading(id INTEGER PRIMARY KEY,quantity INTEGER NOT NULL CHECK(quantity>=0),raw ANY) STRICT")
    db.execute("INSERT INTO reading VALUES(?,?,?)", (1, "12", "003"))
    try:
        db.execute("INSERT INTO reading VALUES(?,?,?)", (2, "pear", "003"))
    except sqlite3.IntegrityError as error:
        print("rejected", type(error).__name__)
    else:
        raise AssertionError("expected datatype rejection")
    print("stored", db.execute("SELECT quantity,typeof(quantity),raw,typeof(raw) FROM reading WHERE id=1").fetchone())
    print("rows", db.execute("SELECT COUNT(*) FROM reading").fetchone()[0])
الناتج المتوقع
rejected IntegrityError
stored (12, 'integer', '003', 'text')
rows 1

تصبح الكمية12 صحيحة، ويبقى raw النص003، ولا يزيد الرفض العدد عن واحد.

أصلح حد الإدخال أو المخطط المثبت بالدليل

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

تحقق من نجاح الإصلاح

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

امنع تكرار المشكلة

  • وثق دور الحقل ووحدته وألفته أو STRICT وغيابه وطوله ومداه ونوع ربط المضيف. اختبر الترحيل وكل كاتب بديل بالعقد، واحفظ دليل رفض مضبوطاً دون استبدال غير الصالح بافتراض معقول ظاهرياً.

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