البرمجة

إدارة قواعد بيانات فلاسك

استخدام إضافة Flask-SQLAlchemy للتخاطب مع قواعد بيانات تطبيقات فلاسك

يُعدّ إطار العمل Flask من أشهر أُطُر تطوير تطبيقات الويب بلغة بايثون، نظراً لخفته وسهولة استخدامه ومرونته العالية. ولكن عند بناء تطبيقات معقدة أو تتطلب تخزين بيانات وتنظيمها بطريقة فعالة، يصبح التعامل مع قواعد البيانات ضرورة حتمية. وهنا تبرز أهمية إضافة Flask-SQLAlchemy كوسيط قوي وسلس يمكّن المطورين من التعامل مع قواعد البيانات عبر ORM (Object-Relational Mapping) بطريقة منظمة وسهلة داخل بيئة Flask.


مقدمة عن Flask-SQLAlchemy

Flask-SQLAlchemy هي إضافة (Extension) لـ Flask توفر طبقة تجريدية فوق مكتبة SQLAlchemy الشهيرة، مما يسهل على مطوري تطبيقات الويب التعامل مع قواعد البيانات العلائقية (Relational Databases) دون الحاجة لكتابة استعلامات SQL يدوية بشكل متكرر.

تجمع Flask-SQLAlchemy بين قوة SQLAlchemy في التحكم في قواعد البيانات وبين بساطة Flask في بناء تطبيقات الويب، فتسمح لك بإنشاء نماذج (Models) تعكس جداول قواعد البيانات، وتنفيذ عمليات الإدخال، التحديث، الحذف، والاستعلام بكود بايثون واضح وسهل القراءة.


لماذا استخدام Flask-SQLAlchemy؟

  1. سهولة الربط مع قواعد البيانات: توفر Flask-SQLAlchemy واجهة مبسطة لتهيئة الاتصال بقواعد البيانات المتنوعة مثل SQLite, MySQL, PostgreSQL وغيرها.

  2. التعامل مع البيانات عبر كائنات بايثون: بدلاً من كتابة استعلامات SQL مباشرة، يمكن للمطورين التعامل مع بياناتهم عبر كائنات ونماذج، مما يعزز قابلية الصيانة ويقلل الأخطاء.

  3. مرونة في الاستعلامات: مع دعم SQLAlchemy القوي، يمكن إجراء استعلامات معقدة باستخدام واجهة برمجية غنية ومتقدمة.

  4. إدارة المهاجرات (Migrations): بالتعاون مع إضافات مثل Flask-Migrate، تسهل Flask-SQLAlchemy إدارة تغييرات هيكل قاعدة البيانات بشكل آمن ومرتب.


إعداد Flask-SQLAlchemy في تطبيق فلاسك

لبدء استخدام Flask-SQLAlchemy في مشروع Flask، يجب اتباع الخطوات التالية:

1. تثبيت المكتبة

bash
pip install Flask-SQLAlchemy

2. إنشاء تطبيق Flask وتهيئة قاعدة البيانات

python
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app)
  • SQLALCHEMY_DATABASE_URI: تحدد نوع قاعدة البيانات ومكانها. المثال أعلاه يستخدم قاعدة بيانات SQLite محلية.

  • SQLALCHEMY_TRACK_MODIFICATIONS: تعطيل تتبع التعديلات لتقليل استهلاك الذاكرة.


تعريف النماذج Models

تُعرّف النماذج في Flask-SQLAlchemy ككائنات بايثون تمثل الجداول في قاعدة البيانات، وكل نموذج هو صف دراسي يرث من db.Model.

مثال على نموذج مستخدم User:

python
class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) age = db.Column(db.Integer) def __repr__(self): return f'{self.username}>'
  • db.Column: تحدد عمود في الجدول.

  • primary_key=True: يميز العمود كمفتاح رئيسي.

  • unique=True: يضمن عدم تكرار القيم في هذا العمود.

  • nullable=False: يمنع القيمة الفارغة في هذا العمود.


عمليات CRUD الأساسية

Flask-SQLAlchemy يجعل التعامل مع قاعدة البيانات كائنياً تماماً، مع دعم كامل لجميع العمليات الأساسية:

1. إنشاء سجل جديد (Create)

python
new_user = User(username='ahmed', email='[email protected]', age=30) db.session.add(new_user) db.session.commit()
  • db.session.add(): يضيف السجل الجديد إلى الجلسة.

  • db.session.commit(): يحفظ التغييرات إلى قاعدة البيانات.

2. قراءة البيانات (Read)

قراءة جميع المستخدمين:

python
users = User.query.all()

قراءة مستخدم معين:

python
user = User.query.filter_by(username='ahmed').first()

3. تحديث سجل موجود (Update)

python
user = User.query.filter_by(username='ahmed').first() user.email = '[email protected]' db.session.commit()

4. حذف سجل (Delete)

python
user = User.query.filter_by(username='ahmed').first() db.session.delete(user) db.session.commit()

التعامل مع علاقات الجداول

تدعم Flask-SQLAlchemy العلاقات بين الجداول بسهولة، مثل علاقات واحد إلى واحد، واحد إلى متعدد، والعديد إلى العديد.

مثال لعلاقة واحد إلى متعدد (User و Post)

python
class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) posts = db.relationship('Post', backref='author', lazy=True) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(200), nullable=False) content = db.Column(db.Text, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
  • db.relationship: يعرّف العلاقة من جهة النموذج الأصلي.

  • db.ForeignKey: يربط العمود بعمود مفتاح رئيسي في جدول آخر.

يمكن الآن الوصول إلى كل المنشورات الخاصة بمستخدم معين عن طريق:

python
user = User.query.first() user_posts = user.posts

إدارة المهاجرات (Database Migrations)

عند تطوير التطبيقات، تتطلب قاعدة البيانات تحديثات مستمرة. للحفاظ على هذه التغييرات بشكل منظم دون فقد البيانات، تستخدم أداة Flask-Migrate التي تعتمد على Alembic.

خطوات استخدام Flask-Migrate:

  1. تثبيت المكتبة:

bash
pip install Flask-Migrate
  1. تهيئة في التطبيق:

python
from flask_migrate import Migrate migrate = Migrate(app, db)
  1. تنفيذ الأوامر عبر الطرفية:

bash
flask db init # تهيئة مجلد المهاجرات flask db migrate # إنشاء ملف ترحيل التغييرات flask db upgrade # تطبيق التغييرات على قاعدة البيانات

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


ميزات إضافية لـ Flask-SQLAlchemy

  • دعم استعلامات متقدمة: مثل الانضمامات (joins)، الترتيب (order_by)، والتصفية (filter) مع تعبيرات مركبة.

  • تعامل تلقائي مع الجلسات: تضمن أن الجلسة تدار بشكل جيد لتجنب تعارضات البيانات.

  • سهولة التكامل مع مكتبات Flask الأخرى: مثل Flask-Login لإدارة المستخدمين، Flask-WTF لنماذج الويب، وغيرها.

  • دعم الاستعلامات المتزامنة (في الإصدارات الحديثة) مع تحسينات للأداء.


مقارنة بين SQLAlchemy و Flask-SQLAlchemy

الخاصية SQLAlchemy (مكتبة أساسية) Flask-SQLAlchemy (امتداد Flask)
التهيئة معقدة بعض الشيء سهلة وبسيطة بفضل الربط مع Flask
دعم اتصال التطبيق عام لجميع التطبيقات بايثون مخصص لتطبيقات Flask ويدمج بسلاسة معها
إدارة الجلسات يدوي أو شبه تلقائي إدارة تلقائية للجلسات مع Flask
دعم الإضافات مستقل يتكامل مع إضافات Flask الأخرى بسهولة
سهولة الاستخدام يحتاج خبرة أكثر مصمم لتسهيل الاستخدام في بيئة Flask

نصائح مهمة عند استخدام Flask-SQLAlchemy

  1. تعطيل SQLALCHEMY_TRACK_MODIFICATIONS: لأن تفعيلها يزيد من استهلاك الموارد ولا يُنصح به إلا للضرورة.

  2. استخدام الجلسة (session) بحذر: الالتزام بعمليات commit و rollback عند الحاجة لمنع تعارض البيانات.

  3. تحديد الحقول بشكل دقيق: مثل الطول المسموح به في النصوص، وقواعد الفريدة والاختيارية.

  4. الاعتماد على المهاجرات لإدارة التغيرات: بدلاً من تعديل قاعدة البيانات يدوياً.

  5. الاختبار المستمر: من المهم اختبار استعلامات قاعدة البيانات خاصة في الحالات المعقدة لتجنب الأخطاء.


مثال تطبيقي كامل بسيط

python
from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) @app.route('/users', methods=['POST']) def add_user(): data = request.get_json() user = User(username=data['username'], email=data['email']) db.session.add(user) db.session.commit() return jsonify({'message': 'User created'}), 201 @app.route('/users', methods=['GET']) def get_users(): users = User.query.all() output = [] for user in users: user_data = {'username': user.username, 'email': user.email} output.append(user_data) return jsonify(output) if __name__ == '__main__': app.run(debug=True)

الخاتمة

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

تساهم Flask-SQLAlchemy في تسريع عملية التطوير وتحسين جودة الكود، وتقديم حلول مرنة لإدارة قواعد البيانات ضمن بيئة Python Flask، مما يجعلها خياراً لا غنى عنه لكل مطور يسعى لبناء تطبيقات ويب متطورة وحديثة.


المصادر والمراجع