التعامل مع قواعد البيانات بأفضل أسلوب ممكن في بايثون

 طريقة التعامل مع قواعد البيانات بأفضل أسلوب ممكن في بايثون

المثال التالي يعلمك طريقة التعامل مع قواعد البيانات بأفضل أسلوب ممكن لضمان أن لا يحدث أي خطأ يؤدي إلى إيقاف البرنامج بشكل مفاجئ.
فعلياً, سنضع كل كود يمكن أن يسبب خطأ بداخل بلوك try.. except.
كما أننا سنتعمد كتابة إستعلام منطقياً لا يمكن أن يتنفذ حيث أننا سنحاول حذف كل معلومات الموظف الذي يملك رقم id يساوي 1000 في الجدول employee.


معلومة تقنية

لحفظ أي معلومات قمت بإضافتها, تعديلها أو مسحها من أي جدول في قاعدة البيانات, يجب أن تستدعي الدالة commit() لحفظ التغيرات.
و لإلغاء تنفيذ أي إستعلام قمت بإرساله, يجب أن تستدعي الدالة rollback() و التي ستقوم بشكل تلقائي بإلغاء كل التغيرات التي فعلتها سابقاً.


مثال

Test.py
                    # mysql.connector هنا قمنا بتضمين كل محتوى الموديول
      import mysql.connector

      try:
      # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect() هنا قمنا باستدعاء الدالة
      # لأنه يوجد إحتمال أن يحدث خطأ أثناء الإتصال بخادم قاعدة البيانات try قمنا باستدعاء هذه الدالة بداخل بلوك
      db = mysql.connector.connect(
      user='root',
      passwd='',
      host='localhost',
      database='company'
      )
      except:
      # exit(0) في حال حدوث خطأ في الإتصال, سيتم تنفيذ أمر الطباعة التالي و من ثم إيقاف عمل البرنامج بسبب الدالة
      print("Error: Can't connect to database")
      exit(0)


      # يسمح لنا بالتعامل مع قاعدة البيانات cursor لإنشاء كائن cursor() هنا قمنا باستدعاء الدالة
      cursor = db.cursor()

      # 'employee' وضعنا فيه نص الإستعلام الذي يقضي بحذف سطر واحد من الجدول sql المتغير
      sql = 'DELETE FROM employee WHERE ID = %s'

      # sql يمثل المعلومات التي سيتم دمجها مع الإستعلام الذي قمنا بتجهيزه في الكائن tuple عبارة عن val الكائن
      val = ('1000',)

      try:
      # لحفظ أي تغيرات يتم إجراءها commit() لإرسال الإستعلام إلى قاعدة البيانات. و استدعينا الدالة execute() هنا قمنا باستدعاء الدالة
      # يساوي 1000 id لأنه قد يحدث خطأ في حال عدم وجود موظف يملك رقم try قمنا بوضع هاتين الدالتين بداخل بلوك
      cursor.execute(sql, val)
      db.commit()
      except:
      # في حال حدوث خطأ أثناء تنفيذ الإستعلام, سيتم طباعة أنه قد حدث خطأ
      # لإلغاء أي شيء حدث في قاعدة البيانات بعد محاولة تنفيذ الإستعلام rollback() قمنا باستدعاء الدالة
      print("Error: unable to delete a record")
      db.rollback()

      # هنا قمنا بطباعة عدد الأسطر التي تم حذفها من الجدول بسبب الإستعلام الذي تم إرساله سابقاً
      print(cursor.rowcount, 'record(s) deleted')

      # هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
      cursor.close()
      db.close()

    

بعد تشغيل الملف Test سيحدث خطأ سببه عدم وجود موظف يملك رقم id يساوي 1000 في الجدول employee لكنه لن يؤدي إلى إيقاف البرنامج و لن يسبب أي مشكلة في قاعدة البيانات.

أيضاً سيتم طباعة عدد الأسطر التي تم حذفها كالتالي.

0 record(s) deleted