التعامل مع قواعد البيانات في بايثون | Python Database

Python  قواعد البيانات في بايثون

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

 

في هذا الدرس ستتعلم كيف تتعامل مع قواعد بيانات MySQL من تطبيقاتك التي تطورها بلغة بايثون.


معلومة تقنية

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



ملاحظة

في حال كنت لا تملك أي فكرة أو خبرة في التعامل مع قواعد اليبانات فسبق و أعددنا مرجع شامل لتعلمها من الصفر.

دورة قواعد البيانات موجوده في المدونة

تنصيب الحزمة mysql-connector في بايثون

للتعامل مع قواعد بيانات MySQL يجب تنصيب الحزمة mysql-connector المخصصة للتعامل معها.
لذلك إفتح موجه الأوامر في PyCharm و أكتب الأمر التالي.

pip install mysql-connector
	

بعد تنصيب الحزمة mysql-connector بنجاح تصبح قادر على تضمينها و استخدام الدوال الموجودة فيها.

الإتصال بقواعد بيانات MySQL في بايثون

أول شيء يجب أن تفعله للإتصال بقاعدة البيانات هو تضمين الموديول mysql.connector من الحزمة mysql-connector كالتالي.

import mysql.connector
	

الآن أصبح بإمكانك استخدام الدوال connect(), cursor(), execute() و غيرهم من الدوال الجاهزة في هذا الموديول للتعامل مع قواعد البيانات.



MySQL - الدالة connect()

هذه الدالة تستخدم لإنشاء كائن نوعه MySQLConnection يسمح لنا بالإتصال بقاعدة البيانات. و هي مبنية كالتالي.

mysql.connector.connect(host='', user='', passwd='', database='')
	

  • الباراميتر host نمرر لها المكان الموجود عليه خادم قاعدة البيانات.

  • الباراميتر user نمرر له إسم المستخدم الذي سنتعامل من خلاله مع قاعدة البيانات.

  • الباراميتر passwd نمرر له كلمة مرور المستخدم الذي سنتعامل من خلاله مع قاعدة البيانات.

  • الباراميتر database نمرر له إسم قاعدة البيانات التي ننوي التعامل معها.



ملاحظة

المعلومات الإفتراضي للإتصال بقواعد بيانات MySQL في حال لم تقم أنت بتغييرها هي التالية:

  • إسم المستخدم الإفتراضي هو 'root'

  • المستخدم الإفتراضي ليس له كلمة مرور, أي كلمة مروره هي ''

  • في حال كانت قاعدة البيانات موجودة على حاسوبك, فإن قيمة الباراميتر host ستكون 'localhost'

في كل الأمثلة التي سنقوم فيها بالإتصال بقواعد البيانات سنستخدم هذه المعلومات لإنشاء الإتصال.



في المثال التالي قمنا بتضمين الحزمة mysql-connector, ثم قمنا باستدعاء الدالة connect() لإنشاء كائن يسمح لنا بالإتصال بخادم قواعد البيانات.
بعدها قمنا بعرض هذا الكائن للتأكد فقط منه قد تم إنشاء هذا الكائن في الذاكرة.

مثال

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

# MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect هنا قمنا باستدعاء الدالة
db = mysql.connector.connect(
  host='localhost',
  user='root',
  passwd=''
)

# كما هو للتأكد فقط من أن معلومات الإتصال بخادم قواعد البيانات صحيحة لإنها إن لم تكن كذلك سيظهر خطأ db هنا قمنا بطباعة الكائن
print(db)
		

سنحصل على نتيجة تشبه النتيجة التالية عند تشغيل الملف Test.

<mysql.connector.connection.MySQLConnection object at 0x012A18F0>


MySQL  - الدالة cursor()

هذه الدالة تستدعى من الكائن الذي ترجعه الدالة connect(), و هي ترجع كائن نوعه MySQLCursor.
كائن الـ MySQLCursor يحتوي على دوال جاهزة يمكن استخدامها للأسباب التالية:

  • لإرسال إستعلامات ( Queries ) إلى خادم قاعدة البيانات.

  • للحصول على النتائج ( Results ) التي يرجعها خادم قاعدة البيانات بعد أن يتم تنفيذ الإستعلام.

لا تقلق, ستتعلم طريقة استخدامها لاحقاً من الأمثلة.



MySQL - الدالة execute(operation)

هذه الدالة تستدعى من الكائن الذي ترجعه الدالة cursor(), من أجل إرسال إستعلامات إلى خادم قاعدة البيانات.
مكان البارميتر operation نمرر نص يمثل الإستعلام الذي نريد إرساله إلى خادم قاعدة البيانات.

لا تقلق, ستتعلم طريقة استخدامها لاحقاً من الأمثلة.

أمثلة شاملة حول التعامل مع قواعد البيانات في بايثون

ستتعلم من الأمثلة التالية طريقة إنشاء قاعدة بيانات بسيطة إسمها ( company ), ثم سننشئ جدول لتخزين بيانات الموظفين إسمه ( employee ).
و سنفترض أن كل موظف له إسم ( name ), يملك رقم هاتف ( phone ), و عنده رقم تعرفة ( id ) خاص فيه.

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


Database - طريقة إنشاء قاعدة بيانات جديدة في بايثون

المثال التالي يعلمك طريقة إنشاء قاعدة بيانات جديدة إسمها company.

مثال

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect() هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost'
                    )

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

                    # و تمرير نص الإستعلام الذي يقضي بإنشاء قاعدة بيانات لها حتى يتم تنفيذه execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('CREATE DATABASE company')

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

إذا لم يظهر لك أي خطأ بعد تشغيل الملف Test فهذا يعني أنه تم إنشاء قاعدة البيانات company بنجاح.

 طريقة إنشاء جدول في قاعدة البيانات في بايثون

المثال التالي يعلمك طريقة إنشاء جدول إسمه employee في قاعدة البيانات company التي أنشأناها في المثال الأول.

مثال

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

                    # 'company' حتى ترجع كائن يسمح لنا بالإتصال بقاعدة البيانات connect() هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # في قاعدة البيانات 'employee' و تمرير نص الإستعلام الذي يقضي بإنشاء جدول إسمه execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('CREATE TABLE employee (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255))')

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

إذا لم يظهر لك أي خطأ بعد تشغيل الملف Test فهذا يعني أنه تم إنشاء الجدول employee بنجاح في قاعدة البيانات company.

 طريقة إضافة عامود جديد في الجدول في بايثون

المثال التالي يعلمك طريقة إضافة عامود جديد إسمه phone في الجدول employee الذي قمنا بإنشاءه في المثال الثاني.

مثال

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

                    # 'company' حتى ترجع كائن يسمح لنا بالإتصال بقاعدة البيانات connect() هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # 'employee' في الجدول 'phone' و تمرير نص الإستعلام الذي يقضي بإضافة عامود جديد إسمه execute() هنا قمنا باستدعاء الدالة
                    cursor.execute("ALTER TABLE employee ADD COLUMN phone VARCHAR(30)")

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

إذا لم يظهر لك أي خطأ بعد تشغيل الملف Test فهذا يعني أنه تم إضافة عامود إسمه phone بنجاح في الجدول employee.

 طريقة إضافة سطر جديد في الجدول في بايثون

المثال التالي يعلمك طريقة إضافة سطر ( أي سجل ) في الجدول employee الذي قمنا بإنشاءه في الأمثلة السابقة.
المعلومات التي سنضيفها على سطر في الجدول, سنقوم بتجهيزها بشكل مرتب في tuple.


معلومة تقنية

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


مثال

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect() هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # 'employee' وضعنا فيه نص الإستعلام الذي يسمح بإضافة سطر جديد في الجدول sql المتغير
                    sql = 'INSERT INTO employee(name, phone) values (%s, %s)'

                    # يمثل القيم التي ستوضع بالترتيب في الجدول tuple عبارة عن val الكائن
                    val = ('Ahmad', '96101200155')

                    # sql و تمرير نص الإستعلام المخزن في المتغير execute() هنا قمنا باستدعاء الدالة
                    # val و من ثم القيم التي سيتم دمجها مع نص الإستعلام و التي قمنا بتخزينها في الكائن
                    cursor.execute(sql, val)

                    # لحفظ التغيرات التي تم إجراءها في قاعدة البيانات commit() هنا قمنا باستدعاء الدالة
                    db.commit()

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

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

إذا لم يظهر لك أي خطأ بعد تشغيل الملف Test فهذا يعني أنه تم إضافة سطر جديد في الجدول employee.

أيضاً سيتم طباعة الجملة التالية في الكونسول.

1 record(s) inserted


معلومة تقنية

قبل إرسال الإستعلام إلى قاعدة البيانات, قامت الدالة execute() بدمج نص الإستعلام و القيم التي مررناها لها كالتالي.

                  INSERT INTO employee(name, phone) values ('Ahmad', '9610200155')
                

 طريقة إضافة عدة أسطر في الجدول في بايثون

المثال التالي يعلمك طريقة إضافة عدة أسطر ( سجلات ) في الجدول employee الذي قمنا بإنشاءه في الأمثلة السابقة دفعة واحدة.

لتمرير مجموعة أسطر للدالة executemany(), سنقوم بإنشاء list كل عنصر فيه عبارة عن tuple.
و هكذا سنقوم بتجهيز المعلومات التي سيتم تخزينها بشكل مرتب في.


معلومة تقنية

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


مثال

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect() هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # 'employee' وضعنا فيه نص الإستعلام الذي يسمح بإضافة سطر جديد في الجدول sql المتغير
                    sql = 'INSERT INTO employee(name, phone) values (%s, %s)'

                    # يمثل الأسطر و القيم التي ستوضع بالترتيب في الجدول tuple عبارة عن val الكائن
                    val = [
                    ('Rami', '96170188201'),
                    ('Sara', '96103200155'),
                    ('Rola', '96176554235'),
                    ('John', '96178665711'),
                    ('Nada', '96171004321')
                    ]

                    # sql و تمرير نص الإستعلام المخزن في المتغير execute() هنا قمنا باستدعاء الدالة
                    # val و من ثم القيم التي سيتم دمجها مع نص الإستعلام و التي قمنا بتخزينها في الكائن
                    cursor.executemany(sql, val)

                    # لحفظ التغيرات التي تم إجراءها في قاعدة البيانات commit() هنا قمنا باستدعاء الدالة
                    db.commit()

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

                    # الذي تم وضعه بشكل تلقائي لآخر عنصر قمنا بإضافته ( id ) هنا قمنا بطباعة رقم التعرفة
                    print('Last row id is', cursor.lastrowid)

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

إذا لم يظهر لك أي خطأ بعد تشغيل الملف Test فهذا يعني أنه تم إضافة 5 أسطر جديدة في الجدول employee.

أيضاً سيتم طباعة الجملة التالية في الكونسول.

5 record(s) inserted     --> هذا السطر يعني أنه تم إضافة 5 أسطر جديدة في الجدول
Last row id is 6       --> رقم تعرفة آخر موظف أضفناه يساوي 6 لأنه السطر السادس في الجدول


معلومة تقنية

قبل إرسال الإستعلام إلى قاعدة البيانات, قامت الدالة executemany() بدمج نص الإستعلام و القيم التي مررناها لها كالتالي.

                  INSERT INTO employee(name, phone) values ('Rami', '96170188201');
                  INSERT INTO employee(name, phone) values ('Sara', '96103200155');
                  INSERT INTO employee(name, phone) values ('Rola', '96176554235');
                  INSERT INTO employee(name, phone) values ('John', '96178665711');
                  INSERT INTO employee(name, phone) values ('Nada', '96171004321');
                

 طريقة جلب كل البيانات المخزنة في جدول في بايثون

المثال التالي يعلمك طريقة جلب كل البيانات المخزنة في جدول و عرضها كما هي.
ملاحظة: سنقوم بجلب معلومات كل الموظفين الذين قمنا بتخزينهم في الأمثلة السابقة في الجدول employee.

المثال الأول

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # 'employee' و تمرير نص الإستعلام الذي يقضي بجلب كل معلومات الموظفين المخزنة في الجدول execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('SELECT * FROM employee')

                    # حتى ترجع كل المعلومات التي أرجعها الإستعلام fetchall() هنا قمنا باستدعاء الدالة
                    # result بعدها قمنا بتخزين كل المعلومات التي تم إرجاعها في الكائن
                    # يمثل سطر في الجدول tuple كل عنصر فيه عبارة عن list عبارة عن result الكائن
                    result = cursor.fetchall()

                    # أي ترجع سطر جديد من الجدول في كل دورة .result موجود في الكائن tuple في كل دورة ترجع for هنا قمنا بإنشاء حلقة
                    # phone و name ,id :يتألف من ثلاث عناصر tuple السطر الذي سيتم إرجاعه, طبعناه كما هو.. لاحظ أنه عبارة عن
                    for row in result:
                    print(row)

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

ستحصل على النتيجة التالية عند تشغيل الملف Test إذا قمت بتخزين نفس البيانات التي قمنا بإدخالها في الأمثلة السابقة.

(1, 'Ahmad', '96101200155')
(2, 'Rami', '96170188201')
(3, 'Sara', '96103200155')
(4, 'Rola', '96176554235')
(5, 'John', '96178665711')
(6, 'Nada', '96171004321')


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

المثال الثاني

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # 'employee' و تمرير نص الإستعلام الذي يقضي بجلب كل معلومات الموظفين المخزنة في الجدول execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('SELECT * FROM employee')

                    # حتى ترجع كل المعلومات التي أرجعها الإستعلام fetchall() هنا قمنا باستدعاء الدالة
                    # result بعدها قمنا بتخزين كل المعلومات التي تم إرجاعها في الكائن
                    # يمثل سطر في الجدول tuple كل عنصر فيه عبارة عن list عبارة عن result الكائن
                    result = cursor.fetchall()

                    # و من ثم تعرض القيم الثلاثة الموجودة فيها بشكل مرتب result موجود في الكائن tuple في كل دورة ترجع for هنا قمنا بإنشاء حلقة
                    for row in result:
                    print('Id:',    row[0])
                    print('Name:',  row[1])
                    print('Phone:', row[2])
                    print('------------------')

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

ستحصل على النتيجة التالية عند تشغيل الملف Test إذا قمت بتخزين نفس البيانات التي قمنا بإدخالها في الأمثلة السابقة.

Id: 1
Name: Ahmad
Phone: 96101200155
------------------
Id: 2
Name: Rami
Phone: 96170188201
------------------
Id: 3
Name: Sara
Phone: 96103200155
------------------
Id: 4
Name: Rola
Phone: 96176554235
------------------
Id: 5
Name: John
Phone: 96178665711
------------------
Id: 6
Name: Nada
Phone: 96171004321
------------------


المثال التالي يعلمك طريقة تحديد الأعمدة التي تريد عرضها بناءاً على أسماء الأعمدة الموجودة فعلياً في الجدول.
هنا سنحدد للدالة cursor() أن كل سطر سيتم إرجاعه سيكون عبارة عن dict, عندها بشكل تلقائي سيتم وضع إسم كل عامود في الجدول كمفتاح, و القيم المخزنة في الجدول كقيم للمفاتيح.

المثال الثالث

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

                    # dict مع الإشارة إلى أننا نريد إرجاع أي سطر يتم جلبه ككائن cursor لإنشاء كائن cursor() هنا قمنا باستدعاء الدالة
                    cursor = db.cursor(dictionary=True)

                    # 'employee' و تمرير نص الإستعلام الذي يقضي بجلب كل معلومات الموظفين المخزنة في الجدول execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('SELECT * FROM employee')

                    # حتى ترجع كل المعلومات التي أرجعها الإستعلام fetchall() هنا قمنا باستدعاء الدالة
                    # result بعدها قمنا بتخزين كل المعلومات التي تم إرجاعها في الكائن
                    # يمثل سطر في الجدول dict كل عنصر فيه عبارة عن list عبارة عن result الكائن
                    result = cursor.fetchall()

                    # result موجود في الكائن dict في كل دورة ترجع for هنا قمنا بإنشاء حلقة
                    # row سيتم جلبهم من الكائن phone و قيمة المفتاح name و قيمة المفتاح id قيمة المفتاح
                    for row in result:
                    print('ID:', row.get('id'))
                    print('Name:', row.get('name'))
                    print('Phone:', row.get('phone'))
                    print('------------------')

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

ستحصل على النتيجة التالية عند تشغيل الملف Test إذا قمت بتخزين نفس البيانات التي قمنا بإدخالها في الأمثلة السابقة.

Id: 1
Name: Ahmad
Phone: 96101200155
------------------
Id: 2
Name: Rami
Phone: 96170188201
------------------
Id: 3
Name: Sara
Phone: 96103200155
------------------
Id: 4
Name: Rola
Phone: 96176554235
------------------
Id: 5
Name: John
Phone: 96178665711
------------------
Id: 6
Name: Nada
Phone: 96171004321
------------------

 طريقة جلب البيانات المخزنة في جدول ضمن شروط محددة في بايثون

المثال التالي يعلمك طريقة جلب البيانات المخزنة في جدول ضمن شروط محددة.
ملاحظة: سنقوم بجلب معلومات كل موظف في الجدول employee عنده رقم Id أكبر من 3.

المثال الأول

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # أكبر من 3 id الذين يملكون رقم 'employee' و تمرير نص الإستعلام الذي يقضي بجلب كل معلومات الموظفين المخزنة في الجدول execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('SELECT * FROM employee WHERE id > 3')

                    # حتى ترجع كل المعلومات التي أرجعها الإستعلام fetchall() هنا قمنا باستدعاء الدالة
                    # result بعدها قمنا بتخزين كل المعلومات التي تم إرجاعها في الكائن
                    # يمثل سطر في الجدول tuple كل عنصر فيه عبارة عن list عبارة عن result الكائن
                    result = cursor.fetchall()

                    # result موجود في الكائن tuple في كل دورة ترجع for هنا قمنا بإنشاء حلقة
                    # بعدها تعرضه كما هو .row ثم تخزنه بشكل مؤقت في الكائن
                    for row in result:
                    print(row)

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

ستحصل على النتيجة التالية عند تشغيل الملف Test إذا قمت بتخزين نفس البيانات التي قمنا بإدخالها في الأمثلة السابقة.

(4, 'Rola', '96176554235')
(5, 'John', '96178665711')
(6, 'Nada', '96171004321')


ملاحظة

في حال قمت بكتابة إستعلام يرجع سطر واحد فقط, عندها الأفضل و الأسهل لك هو استخدام الدالة fetchone() للتعامل مع البيانات التي تم جلبها.

هذه الدالة ترجع tuple واحد يحتوي على المعلومات التي تم إرجاعها.
و في حال قمت بإرسال إستعلام يرجع أكثر من سطر, ثم قمت باستخدام هذه الدالة للتعامل مع البيانات التي تم إرجاعها فإنها سترجع لك آخر سطر أرجعه لك الإستعلام فقط.



المثال التالي يعلمك طريقة جلب سطر واحد من قاعدة البيانات و من ثم عرض البيانات التي تم جلبها كما هي.

المثال الثاني

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # يساوي 1 id و الذي يملك رقم 'employee' و تمرير نص الإستعلام الذي يقضي بجلب كل معلومات الموظف الموجود في الجدول execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('SELECT * FROM employee WHERE id = 1')

                    # tuple حتى ترجع كل المعلومات التي أرجعها الإستعلام ككائن fetchone() هنا قمنا باستدعاء الدالة
                    # result بعدها قمنا بتخزين كل المعلومات التي تم إرجاعها في الكائن
                    result = cursor.fetchone()

                    # كما هي result هنا قمنا بعرض المعلومات المخزنة في الكائن
                    print(result)

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

ستحصل على النتيجة التالية عند تشغيل الملف Test إذا قمت بتخزين نفس البيانات التي قمنا بإدخالها في الأمثلة السابقة.

(1, 'Ahmad', '96101200155')


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

المثال الثالث

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # يساوي 1 id و الذي يملك رقم 'employee' و تمرير نص الإستعلام الذي يقضي بجلب كل معلومات الموظف الموجود في الجدول execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('SELECT * FROM employee WHERE id = 1')

                    # tuple حتى ترجع كل المعلومات التي أرجعها الإستعلام ككائن fetchone() هنا قمنا باستدعاء الدالة
                    # result بعدها قمنا بتخزين كل المعلومات التي تم إرجاعها في الكائن
                    result = cursor.fetchone()

                    # result هنا قمنا بعرض المعلومات المخزنة في الكائن
                    print('Id:',    result[0])
                    print('Name:',  result[1])
                    print('Phone:', result[2])

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

ستحصل على النتيجة التالية عند تشغيل الملف Test إذا قمت بتخزين نفس البيانات التي قمنا بإدخالها في الأمثلة السابقة.

Id: 1
Name: Ahmad
Phone: 96101200155


المثال التالي يعلمك طريقة تحديد الأعمدة التي تريد عرضها بناءاً على أسماء الأعمدة الموجودة فعلياً في الجدول.
هنا سنحدد للدالة cursor() أن السطر الذي سيتم إرجاعه سيكون عبارة عن dict, عندها بشكل تلقائي سيتم وضع إسم كل عامود في الجدول كمفتاح, و القيم المخزنة في الجدول كقيم للمفاتيح.

المثال الرابع

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

                    # dict مع الإشارة إلى أننا نريد إرجاع أي سطر يتم جلبه ككائن cursor لإنشاء كائن cursor() هنا قمنا باستدعاء الدالة
                    cursor = db.cursor(dictionary=True)

                    # يساوي 1 id و الذي يملك رقم 'employee' و تمرير نص الإستعلام الذي يقضي بجلب كل معلومات الموظف الموجود في الجدول execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('SELECT * FROM employee WHERE id = 1')

                    # tuple حتى ترجع كل المعلومات التي أرجعها الإستعلام ككائن fetchone() هنا قمنا باستدعاء الدالة
                    # result بعدها قمنا بتخزين كل المعلومات التي تم إرجاعها في الكائن
                    result = cursor.fetchone()

                    # result هنا قمنا بعرض المعلومات المخزنة في الكائن
                    print('ID:', result.get('id'))
                    print('Name:', result.get('name'))
                    print('Phone:', result.get('phone'))

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

ستحصل على النتيجة التالية عند تشغيل الملف Test إذا قمت بتخزين نفس البيانات التي قمنا بإدخالها في الأمثلة السابقة.

Id: 1
Name: Ahmad
Phone: 96101200155

 طريقة تعديل البيانات المخزنة في الجدول في بايثون

المثال التالي يعلمك طريقة تعديل المعلومات المخزنة في جدول.
فعلياً, سنقوم بتغيير إسم الموظف الذي يملك رقم id يساوي 3 في الجدول employee.


معلومة تقنية

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


مثال

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect() هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

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

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

                    # sql و تمرير نص الإستعلام المخزن في المتغير execute() هنا قمنا باستدعاء الدالة
                    # val و من ثم القيم التي سيتم دمجها مع نص الإستعلام و التي قمنا بتخزينها في الكائن
                    cursor.execute(sql, val)

                    # لحفظ التغيرات التي تم إجراءها في قاعدة البيانات commit() هنا قمنا باستدعاء الدالة
                    db.commit()

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

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

إذا لم يظهر لك أي خطأ بعد تشغيل الملف Test فهذا يعني أنه تم تعديل إسم الموظف بنجاح في الجدول employee.

أيضاً سيتم طباعة الجملة التالية في الكونسول.

1 record(s) affected


معلومة تقنية

قبل إرسال الإستعلام إلى قاعدة البيانات, قامت الدالة execute() بدمج نص الإستعلام و القيم التي مررناها لها كالتالي.

                  UPDATE employee SET name = 'Lara' WHERE ID = 3
                

 طريقة حذف البيانات المخزنة في الجدول في بايثون

المثال التالي يعلمك طريقة حذف سطر من جدول.
فعلياً, سنقوم بحذف كل معلومات الموظف الذي يملك رقم id يساوي 4 في الجدول employee.


معلومة تقنية

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


المثال الأول

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect() هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

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

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

                    # sql و تمرير نص الإستعلام المخزن في المتغير execute() هنا قمنا باستدعاء الدالة
                    # val و من ثم القيم التي سيتم دمجها مع نص الإستعلام و التي قمنا بتخزينها في الكائن
                    cursor.execute(sql, val)

                    # لحفظ التغيرات التي تم إجراءها في قاعدة البيانات commit() هنا قمنا باستدعاء الدالة
                    db.commit()

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

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

إذا لم يظهر لك أي خطأ بعد تشغيل الملف Test فهذا يعني أنه تم حذف السطر بنجاح من الجدول employee.

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

1 record(s) deleted


معلومة تقنية

قبل إرسال الإستعلام إلى قاعدة البيانات, قامت الدالة execute() بدمج نص الإستعلام و القيم التي مررناها لها كالتالي.

                  DELETE FROM employee WHERE ID = 4
                


المثال التالي يعلمك طريقة حذف كل الأسطر الموجودة في الجدول و طباعة عدد الأسطر التي تم حذفها.

المثال الثاني

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

                    # MySQL حتى ترجع كائن يسمح لنا بالإتصال بقواعد بيانات connect() هنا قمنا باستدعاء الدالة
                    db = mysql.connector.connect(
                    user='root',
                    passwd='',
                    host='localhost',
                    database='company'
                    )

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

                    # 'employee' و تمرير نص الإستعلام الذي يقضي بحذف كل الأسطر الموجودة في الجدول execute() هنا قمنا باستدعاء الدالة
                    cursor.execute('DELETE FROM employee')

                    # لحفظ التغيرات التي تم إجراءها في قاعدة البيانات commit() هنا قمنا باستدعاء الدالة
                    db.commit()

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

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

إذا لم يظهر لك أي خطأ بعد تشغيل الملف Test فهذا يعني أنه تم حذف كل أسطر الجدول employee بنجاح.

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

5 record(s) deleted

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

المثال التالي يعلمك طريقة التعامل مع قواعد البيانات بأفضل أسلوب ممكن لضمان أن لا يحدث أي خطأ يؤدي إلى إيقاف البرنامج بشكل مفاجئ.
فعلياً, سنضع كل كود يمكن أن يسبب خطأ بداخل بلوك 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