برمجة قواعد البيانات بلغة بايثون – دروس للمبتدئين

This post is also available in: English (الإنجليزية)

تعتمد كل منظمة تقريبًا على قواعد بياناتكبيرة. هذه هي في الأساس مجموعات من الجداول ومتصلة من خلال الأعمدة. تدعم أنظمة قواعد البيانات هذه SQL ، لغة الاستعلام الهيكلية ، والتي تُستخدم لإنشاء البيانات والوصول إليها ومعالجتها. يتم استخدام SQL للوصول إلى البيانات ، وكذلك لإنشاء العلاقات بين البيانات المخزنة واستغلالها. بالإضافة إلى ذلك ، تدعم قواعد البيانات قواعد تطبيع قاعدة البيانات لتجنب تكرار البيانات.

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

تتميز لغة برمجة Python بميزات قوية لبرمجة قواعد البيانات. تدعم Python قواعد بيانات مختلفة مثل MySQLو Oracleو Sybaseو PostgreSQLوما إلى ذلك. تدعم Python أيضًا لغة تعريف البيانات (DDL) ولغة معالجة البيانات (DML) وبيانات استعلام البيانات. بالنسبة لبرمجة قواعد البيانات ، فإن Python DB API هي وحدة نمطية مستخدمة على نطاق واسع توفر واجهة برمجة تطبيق قاعدة البيانات.

Database Programming in Python

DB-API (SQL-API) لبيثون

يوفر Python DB-API المستقل عن أي محرك قاعدة بيانات ويمكّنك من كتابة نصوص Python للوصول إلى أي محرك قاعدة بيانات. فيما يلي تنفيذ Python DB-API لقواعد البيانات المختلفة –

  • بالنسبة إلى MySQL ، فهو MySQLdb.
  • بالنسبة لـ PostgreSQL ، فهي psycopg و PyGresQL و pyPgSQL
  • بالنسبة إلى Oracle ، تحتوي على dc_oracle2 و cx_oracle.
  • بالنسبة لتطبيق DB2 DB-API هو Pydb2.

يتكون DB-API من Python من كائنات الاتصال وكائنات المؤشر والاستثناءات القياسية وبعض محتويات الوحدة الأخرى.

كائنات الاتصال

تنشئ كائنات الاتصال في DB-API في Python اتصالًا بقاعدة البيانات التي تُستخدم أيضًا في معاملات مختلفة. يتم استخدام كائنات الاتصال هذه أيضًا كممثلين لجلسة قاعدة البيانات.

يتم إنشاء اتصال بقاعدة بيانات في Python على النحو التالي:

conn = MySQLdb.connect(‘library’, user=’user_name’, password=’python’)

بعد إنشاء الاتصال بقاعدة البيانات ، يمكنك استخدامها لاستدعاء كائنات مثل commit () وrollback () وclose ().

Commit: بشكل عام ، الالتزام هو تحديث سجل في قاعدة بيانات. في سياق معاملة قاعدة البيانات ، يشير الالتزام إلى حفظ البيانات بشكل دائم بعد مجموعة من التغييرات المؤقتة. ينهي الالتزام المعاملة داخل قاعدة بيانات علائقية ويسمح لجميع المستخدمين الآخرين برؤية التغييرات.

Rollback: في تقنيات قاعدة البيانات ، التراجع هو عملية تعيد قاعدة البيانات إلى حالة سابقة. تعتبر عمليات التراجع مهمة لتكامل قاعدة البيانات لأنها تعني أنه يمكن استعادة قاعدة البيانات إلى نسخة نظيفة حتى بعد تنفيذ العمليات الخاطئة.

cur = conn.cursor() //creates new cursor object for executing SQL statementsconn.commit() //Commits the transactionsconn.rollback() //Roll back the transactionsconn.close() //closes the connectionconn.callproc(proc,param) //call stored procedure for executionconn.getsource(proc) //fetches stored procedure code

كائنات المؤشر

يعد المؤشر أحد ميزات SQL القوية. هذه هي الكائنات المسؤولة عن إرسال عبارات SQL المختلفة إلى خادم قاعدة البيانات. هناك العديد من فئات المؤشر في MySQLdb.cursors:

  • BaseCursorهي الفئة الأساسية لكائنات المؤشر.
  • Cursorهو فئة المؤشر الافتراضية. CursorWarningMixInو CursorStoreResultMixInو CursorTupleRowsMixInو BaseCursorهي بعض مكونات فئة المؤشر.
  • يستخدم CursorStoreResultMixIn الدالة mysql_store_result() لاسترداد مجموعات النتائج من الاستعلام المنفذ. يتم تخزين مجموعات النتائج هذه في جانب العميل.
  • يستخدم CursorUseResultMixInالدالة mysql_use_result() لاسترداد مجموعات النتائج من الاستعلام المنفذ. يتم تخزين مجموعات النتائج هذه على جانب الخادم.

يوضح المثال التالي تنفيذ أوامر SQL باستخدام كائنات المؤشر. يمكنك استخدام تنفيذ لتنفيذ أوامر SQL مثل SELECT. لارتكاب جميع عمليات SQL ، تحتاج إلى إغلاق المؤشر باعتباره cursor.close ().

cursor.execute(‘SELECT * FROM books’)cursor.execute(”’SELECT * FROM books WHERE book_name = ‘python’ AND book_author = ‘Mark Lutz’)cursor.close()

كائنات المؤشر

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

سمات المؤشر

يجب أن تستجيب كائنات المؤشر للأساليب والسمات التالية.

.description: سمة القراءة فقط هذه عبارة عن سلسلة من 7 عناصر متتابعة. يحتوي كل تسلسل من هذه التسلسلات على معلومات تصف عمود نتيجة واحد:

  • name
  • type_code
  • display_size
  • internal_size
  • precision
  • scale
  • null_ok

العناصر الأولى والثانية (name وtype_code) إلزامية ، أما العناصر الخمسة الأخرى فهي اختيارية ويتم تعيينها على لا شيء إذا لم يتم توفير قيم ذات معنى. ستكون هذه السمة بلا للعمليات التي لا تُرجع الصفوف أو إذا لم يتم استدعاء المؤشر لعملية عبر طريقة .execute* () حتى الآن.

.rowcount: تحدد هذه السمة للقراءة فقط عدد الصفوف التي أنتجها آخر تنفيذ * () (لعبارات DQL مثل SELECT) أو المتأثرة (لعبارات DML مثل UPDATE أو INSERT) السمة هي -1 في حالة تنفيذ no. * () على المؤشر أو لا يمكن تحديد عدد الصفوف للعملية الأخيرة بواسطة الواجهة.

طرق المؤشر

هذه الطريقة اختيارية لأن قواعد البيانات لا توفر إجراءات مخزنة.

.callproc (procname [، parameters]): يستدعي إجراء قاعدة بيانات مخزنة بالاسم المحدد. يجب أن يحتوي تسلسل المعلمات على إدخال واحد لكل وسيطة يتوقعها الإجراء. يتم إرجاع نتيجة الاستدعاء كنسخة معدلة من تسلسل الإدخال. تُترك معلمات الإدخال كما هي ، ويتم استبدال معلمات الإخراج والإدخال / الإخراج بقيم جديدة محتملة. قد يوفر الإجراء أيضًا مجموعة نتائج كمخرجات. يجب أن يكون هذا متاحًا بعد ذلك من خلال طرق .fetch* () القياسية.

.close(): أغلق المؤشر الآن. سيكون المؤشر غير قابل للاستخدام من هذه النقطة فصاعدًا ؛ سيظهر استثناء خطأ (أو فئة فرعية) إذا تمت محاولة إجراء أي عملية باستخدام المؤشر.

.execute (عملية [، معلمات]): تحضير وتنفيذ عملية قاعدة بيانات (استعلام أو أمر). يمكن تقديم المعلمات كتسلسل أو تعيين وستكون مرتبطة بالمتغيرات في العملية. يتم تحديد المتغيرات في تدوين خاص بقاعدة البيانات. سيحتفظ المؤشر بإشارة إلى العملية. إذا تم تمرير نفس كائن العملية مرة أخرى ، فيمكن للمؤشر تحسين سلوكه. هذا هو الأكثر فعالية للخوارزميات حيث يتم استخدام نفس العملية ، ولكن يتم ربط المعلمات المختلفة بها (عدة مرات)

لتحقيق أقصى قدر من الكفاءة عند إعادة استخدام عملية ما ، من الأفضل استخدام طريقة .setinputsizes() لتحديد أنواع وأحجام المعلمات مسبقًا. من القانوني أن لا تتطابق المعلمة مع المعلومات المحددة مسبقًا ؛ يجب أن يعوض التنفيذ ، ربما بفقدان الكفاءة.

يمكن أيضًا تحديد المعلمات كقائمة من المجموعات على سبيل المثال أدخل عدة صفوف في عملية واحدة ، ولكن هذا النوع من الاستخدام مهمل: يجب استخدام .executemany() بدلاً من ذلك.

.executemany (عملية ، seq_of_parameters): قم بإعداد عملية قاعدة بيانات (استعلام أو أمر) ثم قم بتنفيذها مقابل جميع تسلسلات أو تعيينات المعلمات الموجودة في التسلسل seq_of_parameters. الوحدات النمطية حرة في تنفيذ هذه الطريقة باستخدام استدعاءات متعددة للطريقة .execute() أو باستخدام عمليات المصفوفة لجعل قاعدة البيانات تعالج التسلسل ككل في مكالمة واحدة.

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

.fetchone(): Fetch the next row of a query result set, returning a single sequence, or None when no more data is available. يظهر استثناء خطأ (أو فئة فرعية) إذا لم ينتج عن الاستدعاء السابق لـ .execute* () أي مجموعة نتائج أو لم يتم إصدار أي استدعاء بعد.

.fetchmany (strong، [size=cursor .arraysize]): قم بإحضار المجموعة التالية من الصفوف من نتيجة الاستعلام ، مع عرض تسلسل من التسلسلات (مثل قائمة المجموعات). يتم إرجاع التسلسل الفارغ عند عدم توفر المزيد من الصفوف. يتم تحديد عدد الصفوف المطلوب جلبها لكل مكالمة بواسطة المعلمة. إذا لم يتم تقديمه ، فإن صفيف المؤشر يحدد عدد الصفوف التي يتم جلبها. يجب أن تحاول الطريقة إحضار أكبر عدد من الصفوف كما هو موضح بواسطة معلمة الحجم. إذا لم يكن ذلك ممكنًا بسبب عدم توفر العدد المحدد من الصفوف ، فقد يتم إرجاع عدد أقل من الصفوف. يظهر استثناء خطأ (أو فئة فرعية) إذا لم ينتج عن الاستدعاء السابق لـ .execute* () أي مجموعة نتائج أو لم يتم إصدار أي استدعاء بعد.

.fetchall(): إحضار جميع الصفوف (المتبقية) من نتيجة الاستعلام ، وإعادتها في شكل تسلسل من التسلسلات (مثل قائمة المجموعات). لاحظ أن سمة صفيف المؤشر يمكن أن تؤثر على أداء هذه العملية. يظهر استثناء خطأ (أو فئة فرعية) إذا لم ينتج عن الاستدعاء السابق لـ .execute* () أي مجموعة نتائج أو لم يتم إصدار أي استدعاء بعد.

.nextset(): ستجعل هذه الطريقة المؤشر يتخطى المجموعة المتاحة التالية ، مع تجاهل أي صفوف متبقية من المجموعة الحالية. إذا لم يكن هناك المزيد من المجموعات ، فإن الطريقة ترجع بلا. وبخلاف ذلك ، تقوم بإرجاع قيمة صحيحة ، وستقوم الاستدعاءات اللاحقة لطرق .fetch* () بإرجاع الصفوف من مجموعة النتائج التالية. يظهر استثناء خطأ (أو فئة فرعية) إذا لم ينتج عن الاستدعاء السابق لـ .execute* () أي مجموعة نتائج أو لم يتم إصدار أي استدعاء بعد.

.arraysize: تحدد سمة القراءة / الكتابة هذه عدد الصفوف المراد جلبها في وقت واحد .fetchmany(). يتم تعيينه افتراضيًا على معنى واحد لجلب صف واحد في كل مرة. يجب أن تراعي التطبيقات هذه القيمة المتعلقة بالطريقة .fetchmany () ، لكنها حرة في التفاعل مع قاعدة البيانات بصف واحد في كل مرة. يمكن استخدامه أيضًا في تنفيذ .executemany ().

.setinputsizes (sizes): يمكن استخدام هذا قبل استدعاء .execute* () لتحديد مناطق الذاكرة مسبقًا لمعلمات العملية. يتم تحديد الأحجام كتسلسل – عنصر واحد لكل معلمة إدخال. يجب أن يكون العنصر كائن نوع يتوافق مع الإدخال الذي سيتم استخدامه ، أو يجب أن يكون عددًا صحيحًا يحدد الحد الأقصى لطول معلمة السلسلة. إذا كان العنصر بلا ، فلن يتم حجز منطقة ذاكرة محددة مسبقًا لهذا العمود (هذا مفيد لتجنب المناطق المحددة مسبقًا للمدخلات الكبيرة). يمكن استخدام هذه الطريقة قبل أن يكون الأسلوب .execute * () هو invo

.setoutputsize (الحجم [، العمود]): عيّن حجم المخزن المؤقت للعمود لجلب الأعمدة الكبيرة (على سبيل المثال ، LONGs ، BLOBs ، إلخ). يتم تحديد العمود كفهرس في تسلسل النتائج. سيؤدي عدم تحديد العمود إلى تعيين الحجم الافتراضي لجميع الأعمدة الكبيرة في المؤشر. يمكن استخدام هذه الطريقة قبل استدعاء الأسلوب .execute* ().

Python و MySQL

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

import MySQLdb

اتصال قاعدة البيانات

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

import MySQLdb# Open database connectiondb = MySQLdb.connect(“localhost”,”testuser”,”test123″,”TESTDB” )# prepare a cursor object using cursor() methodcursor = db.cursor()# execute SQL query using execute() method.cursor.execute(“SELECT VERSION()”)# Fetch a single row using fetchone() method.data = cursor.fetchone()print “Database version : %s ” % data# disconnect from serverdb.close()

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

إنشاء جدول قاعدة بيانات

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

يُنشئ الكود التالي جدول قاعدة بيانات “الموظف”:

import MySQLdb# Open database connectiondb = MySQLdb.connect(“localhost”,”testuser”,”test123″,”TESTDB” )# prepare a cursor object using cursor() methodcursor = db.cursor()# Drop table if it already exist using execute() method.cursor.execute(“DROP TABLE IF EXISTS EMPLOYEE”)# Create table as per requirementsql = “””CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )”””cursor.execute(sql)# disconnect from serverdb.close()

INSERT عملية

إنه مطلوب عندما تريد إنشاء سجلاتك في جدول قاعدة بيانات. المثال التالي ، ينفذ عبارة SQL INSERT لإنشاء سجل في جدول EMPLOYEE:

import MySQLdb# Open database connectiondb = MySQLdb.connect(“localhost”,”testuser”,”test123″,”TESTDB” )# prepare a cursor object using cursor() methodcursor = db.cursor()# Prepare SQL query to INSERT a record into the database.sql = “””INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES (‘Mac’, ‘Mohan’, 20, ‘M’, 2000)”””try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit()except: # Rollback in case there is any error db.rollback()# disconnect from serverdb.close()

READ عملية

عملية READعلى أي قاعدة بيانات تعني جلب بعض المعلومات المفيدة من قاعدة البيانات. بمجرد إنشاء اتصال قاعدة البيانات ، فأنت جاهز لإجراء استعلام في قاعدة البيانات هذه. يمكنك استخدام طريقة fetchone() لجلب سجل واحد أو طريقة fetchall() لجلب قيم متعددة من جدول قاعدة بيانات.

  • fetchone(): يجلب الصف التالي من مجموعة نتائج الاستعلام. مجموعة النتائج هي كائن يتم إرجاعه عند استخدام كائن مؤشر للاستعلام عن جدول.
  • fetchall(): يجلب جميع الصفوف في مجموعة النتائج. إذا تم بالفعل استخراج بعض الصفوف من مجموعة النتائج ، فسيتم استرداد الصفوف المتبقية من مجموعة النتائج.
  • rowcount: هذه سمة للقراءة فقط وتقوم بإرجاع عدد الصفوف التي تأثرت بطريقة execute().

يستعلم الكود التالي عن جميع السجلات من جدول الموظف الذي يتقاضى راتبه أكثر من 1000:

import MySQLdb# Open database connectiondb = MySQLdb.connect(“localhost”,”testuser”,”test123″,”TESTDB” )# prepare a cursor object using cursor() methodcursor = db.cursor()sql = “SELECT * FROM EMPLOYEE WHERE INCOME > ‘%d'” % (1000)try: # Execute the SQL command cursor.execute(sql) # Fetch all the rows in a list of lists. results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # Now print fetched result print “fname=%s,lname=%s,age=%d,sex=%s,income=%d” % (fname, lname, age, sex, income )except: print “Error: unable to fecth data”# disconnect from serverdb.close()

UPDATE عملية

تعني عملية UPDATE في أي قاعدة بيانات تحديث سجل واحد أو أكثر ، وهي متوفرة بالفعل في قاعدة البيانات. يقوم الكود التالي بتحديث جميع السجلات التي تحتوي على SEX كـ “M” عن طريق زيادة AGE بمقدار عام واحد.

import MySQLdb# Open database connectiondb = MySQLdb.connect(“localhost”,”testuser”,”test123″,”TESTDB” )# prepare a cursor object using cursor() methodcursor = db.cursor()# Prepare SQL query to UPDATE required recordssql = “UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ‘%c'” % (‘M’)try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit()except: # Rollback in case there is any error db.rollback()# disconnect from serverdb.close()

DELETE عملية

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

import MySQLdb# Open database connectiondb = MySQLdb.connect(“localhost”,”testuser”,”test123″,”TESTDB” )# prepare a cursor object using cursor() methodcursor = db.cursor()# Prepare SQL query to DELETE required recordssql = “DELETE FROM EMPLOYEE WHERE AGE > ‘%d'” % (20)try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit()except: # Rollback in case there is any error db.rollback()# disconnect from serverdb.close()

COMMIT عملية

الالتزام هو العملية ، التي تعطي إشارة خضراء لقاعدة البيانات لإنهاء التغييرات ، وبعد هذه العملية ، لا يمكن التراجع عن أي تغيير. يتم استخدام الكود التالي لإجراء عملية الالتزام:

db.commit()

ROLLBACK عملية

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

db.rollback()

فصل قاعدة البيانات

لقطع اتصال قاعدة البيانات ، يمكنك استخدام طريقة close():

db.close()

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

أضف تعليق