تكرار السؤال: …
الإجابة المختصرة
اجمع عمليات الإدخال في معاملة (transaction) واحدة واستخدم executemany، بدل تنفيذ commit لكل صف.
الشرح
كل commit يفرض كتابة آمنة إلى القرص (fsync)، فالإدخال صفًا صفًا مع commit لكل واحد قد يكون أبطأ بمئات المرات. استخدام with conn: يفتح معاملة ويؤكدها عند النجاح ويلغيها عند الخطأ. للحجوم الضخمة جدًا قسّم الإدخال إلى دفعات محدودة (مثل 10 آلاف صف) حتى لا تطول المعاملة. ويحسّن تفعيل وضع WAL القراءة المتزامنة مع الكتابة.
مثال بالكود
import sqlite3
conn = sqlite3.connect("app.db")
rows = [(i, f"user{i}") for i in range(100_000)]
with conn: # معاملة واحدة: commit عند النجاح و rollback عند الخطأ
conn.executemany("INSERT INTO users (id, name) VALUES (?, ?)", rows)
conn.close()أخطاء شائعة
- استدعاء conn.commit() داخل الحلقة بعد كل صف.
- بناء جملة SQL ضخمة بالدمج النصي بدل executemany مع المعاملات.