استخدام قاعدة بيانات PostgreSQL في تطبيق Flask: تكامل متكامل بين القوة والمرونة
تُعد قواعد البيانات العمود الفقري لأي تطبيق ويب يعتمد على تخزين واسترجاع البيانات، ومع تطور أطر العمل وتنوع استخدامات الويب، أصبح التكامل بين قاعدة البيانات وإطار العمل من العوامل الحاسمة في كفاءة النظام. Flask، كإطار عمل خفيف وقابل للتخصيص لبناء تطبيقات الويب بلغة Python، يتميز بسهولة دمجه مع قواعد بيانات متعددة. PostgreSQL، من جهتها، تُعد واحدة من أقوى قواعد البيانات العلائقية مفتوحة المصدر، وتتميز بقوتها، وأمانها، وتوافقها مع المعايير. وعند دمج Flask مع PostgreSQL، نحصل على بيئة تطوير مرنة وقوية تلائم التطبيقات الصغيرة والكبيرة على حد سواء.
يتناول هذا المقال كل ما يتعلق بعملية دمج واستخدام قاعدة بيانات PostgreSQL داخل تطبيق Flask، بداية من إعداد البيئة إلى تنفيذ الاستعلامات المعقدة، مرورًا بأدوات ORM، والتعامل مع جلسات الاتصال، وطرق التهيئة والنشر.
أولًا: لمحة عن PostgreSQL وFlask
ما هي PostgreSQL؟
PostgreSQL هي قاعدة بيانات علائقية مفتوحة المصدر، تُعرف بدقتها في التعامل مع البيانات المعقدة ودعمها للامتدادات والوظائف المتقدمة. تدعم PostgreSQL:
-
المعاملات (Transactions)
-
العلاقات (Joins)
-
الفهارس (Indexes)
-
دعم JSON وXML
-
الأمن والتحكم في الصلاحيات
-
النسخ الاحتياطي والاستعادة
ما هو Flask؟
Flask هو إطار عمل مصغر (Microframework) بلغة Python لتطوير تطبيقات الويب. يتميز بأنه لا يفرض بنية صارمة، مما يجعله مرنًا للغاية وقابلًا للتوسع حسب الحاجة. يوفر ميزات مثل:
-
التعامل مع المسارات (Routing)
-
قوالب Jinja2
-
دعم الجلسات
-
تكامل سهل مع أدوات ORM مثل SQLAlchemy
ثانيًا: الإعداد الأولي للمشروع
لدمج Flask مع PostgreSQL، نحتاج إلى إعداد البيئة البرمجية التي تشمل:
إنشاء بيئة افتراضية وتثبيت الحزم المطلوبة
bashpython -m venv venv
source venv/bin/activate
pip install Flask psycopg2-binary Flask-SQLAlchemy
إعداد مشروع Flask أساسي
pythonfrom flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'تطبيق Flask مع PostgreSQL يعمل بنجاح!'
ثالثًا: إعداد قاعدة بيانات PostgreSQL
تثبيت PostgreSQL
يتم تثبيت PostgreSQL عبر الأوامر التالية على Ubuntu:
bashsudo apt update sudo apt install postgresql postgresql-contrib
إعداد قاعدة البيانات والمستخدم
bashsudo -u postgres psql
CREATE DATABASE flaskdb;
CREATE USER flaskuser WITH PASSWORD 'strongpassword';
ALTER ROLE flaskuser SET client_encoding TO 'utf8';
ALTER ROLE flaskuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE flaskuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE flaskdb TO flaskuser;
رابعًا: تكامل Flask مع PostgreSQL باستخدام SQLAlchemy
SQLAlchemy هو أشهر ORM بلغة Python، ويتيح التعامل مع قواعد البيانات من خلال كائنات بايثون بدلًا من كتابة استعلامات SQL يدويًا.
إعداد الاتصال بقاعدة البيانات
pythonapp.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://flaskuser:strongpassword@localhost/flaskdb'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
إنشاء كائن قاعدة البيانات
pythonfrom flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
تعريف النماذج (Models)
pythonclass 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)
def __repr__(self):
return f'{self.username} >'
إنشاء الجداول
pythonwith app.app_context():
db.create_all()
خامسًا: العمليات الأساسية على قاعدة البيانات
إضافة بيانات
pythonnew_user = User(username='ahmed', email='[email protected]')
db.session.add(new_user)
db.session.commit()
قراءة البيانات
pythonuser = User.query.filter_by(username='ahmed').first()
تحديث البيانات
حذف البيانات
pythondb.session.delete(user) db.session.commit()
سادسًا: تنظيم المشروع باستخدام Blueprints وتوسعة Flask-Migrate
استخدام Flask-Migrate لترحيل قواعد البيانات
bashpip install Flask-Migrate
pythonfrom flask_migrate import Migrate
migrate = Migrate(app, db)
bashflask db init
flask db migrate -m "Initial migration"
flask db upgrade
سابعًا: إدارة الجلسات والاتصال الآمن
Flask يعمل بشكل افتراضي مع SQLite، لكن عند استخدام PostgreSQL، يجب إدارة الجلسات بشكل محكم خصوصًا عند الاستخدام في بيئة الإنتاج.
-
استخدام
scoped_sessionلتفادي مشاكل تعدد الخيوط -
إدارة الاتصال داخل
app_context -
إغلاق الجلسات بشكل يدوي عند الحاجة
-
استخدام التجزئة والرموز المميزة (tokens) عند التعامل مع معلومات حساسة
ثامنًا: التعامل مع الاستعلامات المعقدة
استعلامات SQL اليدوية
pythonresult = db.session.execute('SELECT * FROM user WHERE username = :name', {'name': 'ahmed'})
for row in result:
print(row)
استخدام وظائف PostgreSQL المتقدمة
يدعم SQLAlchemy الكثير من الميزات المتقدمة لـ PostgreSQL مثل:
-
الاستعلامات الشرطية
-
أنواع البيانات المركبة
-
دعم JSON وARRAY
-
الاستعلامات الفرعية (Subqueries)
تاسعًا: تحسين الأداء باستخدام الفهارس والتحسينات في PostgreSQL
تُعتبر الفهارس من أهم أدوات تحسين الأداء في PostgreSQL. من خلال SQLAlchemy يمكن إنشاء الفهارس على الأعمدة الحساسة:
pythonclass User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), index=True)
...
ويمكن كذلك استخدام الاستعلامات المنضبطة:
-
تحديد الأعمدة المطلوبة فقط (
load_only) -
استخدام
limitوoffsetللصفحات -
تفعيل التهيئة المُسبقة (
joinedload) لتفادي استعلامات N+1
عاشرًا: النشر والإعداد لبيئة الإنتاج
إعداد قاعدة بيانات PostgreSQL على خادم بعيد
-
تهيئة صلاحيات الوصول عن بعد (
pg_hba.conf) -
تفعيل المنفذ 5432 في الجدار الناري
-
إعداد اسم المضيف وربطه بـ DNS
إعداد التطبيق للعمل على خادم ويب مثل Gunicorn وNGINX
bashgunicorn app:app
ويتم إعداد NGINX كواجهة أمامية:
nginxserver {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
جدول يوضح مقارنة بين SQLite وPostgreSQL في بيئة Flask:
| الميزة | SQLite | PostgreSQL |
|---|---|---|
| الأداء مع البيانات الكبيرة | ضعيف | ممتاز |
| دعم الاستعلامات المعقدة | محدود | متقدم جدًا |
| الأمان | ضعيف | عالي |
| التوافر في الإنتاج | غير موصى به | موصى به بقوة |
| تعدد المستخدمين | لا يدعمه بكفاءة | يدعمه بكفاءة |
| دعم الفهارس والمشغلات | جزئي | كامل |
الحادي عشر: الأخطاء الشائعة عند استخدام PostgreSQL مع Flask
-
عدم استخدام
app.app_context()عند العمل مع الجلسات في البرامج النصية
يؤدي ذلك إلى أخطاء متعلقة بغياب السياق. -
نسيان تنفيذ
db.create_all()قبل استخدام النماذج
مما يؤدي إلى أخطاء عدم وجود الجداول. -
إغفال استخدام
commit()بعد التعديلات
حيث لا يتم حفظ البيانات دون استخدامه. -
عدم تهيئة إعدادات البيئة بشكل آمن
مثل كشف كلمة مرور قاعدة البيانات في الشيفرة البرمجية.
الثاني عشر: التكامل مع الأدوات الخارجية وتحليل البيانات
-
استخدام PostgreSQL مع أدوات التحليل مثل Pandas:
pythonimport pandas as pd
df = pd.read_sql('SELECT * FROM user', db.engine)
-
إعداد نسخ احتياطي تلقائي باستخدام
pg_dump
bashpg_dump -U flaskuser flaskdb > backup.sql
-
مزامنة البيانات مع تطبيقات خارجية عبر واجهات REST أو GraphQL
الثالث عشر: تحديثات PostgreSQL وتوافقها مع Flask
مع كل إصدار جديد من PostgreSQL، يتم إضافة تحسينات في الأداء ودعم إضافي لأنواع بيانات جديدة. من المهم التحقق من توافق SQLAlchemy مع النسخ الجديدة، خاصة فيما يتعلق بوظائف JSONB وPostGIS في التطبيقات الجغرافية.

