مقدمة
تطوير تطبيقات الويب الحديثة يرتبط حتماً بتطور هيكل قاعدة البيانات. إضافة جداول جديدة، تغيير أنواع البيانات، إنشاء فهارس، وتعديل العلاقات بين الكيانات — كل هذا يتطلب نهجاً منظماً للإدارة. التعديل اليدوي لهيكل قاعدة البيانات يعرضك للأخطاء، فقدان البيانات، وعدم التوافق بين بيئات التطوير المختلفة.
Alembic هي أداة قوية لإدارة ترحيل قواعد البيانات، صُممت خصيصاً لنظام SQLAlchemy. وهي الحل الرسمي الذي يضمن تغييراً آمناً ومضبوطاً لهيكل قاعدة البيانات، مما يسمح للمطورين بتتبع تاريخ التغييرات، تطبيق التحديثات، وتراجع التعديلات الفاشلة عند الحاجة.
ما هو Alembic
Alembic هي مكتبة لإدارة ترحيل قواعد البيانات في مشاريع Python التي تستخدم SQLAlchemy. توفر أدوات لإنشاء وتطبيق وتراجع تغييرات هيكل قاعدة البيانات بطريقة مضبوطة.
المزايا الرئيسية لـ Alembic
إصدارات هيكل قاعدة البيانات — كل تغيير يُسجل كترحيل منفصل بمعرف فريد، مما يتيح تتبع تطور هيكل البيانات.
توليد الترحيلات تلقائياً — إمكانية إنشاء ملفات الترحيل بناءً على التغييرات في نماذج ORM الخاصة بـ SQLAlchemy، مما يسرع عملية التطوير بشكل كبير.
أمان العمليات — جميع التغييرات تُطبق ضمن معاملات (transactions)، مما يقلل من خطر تلف البيانات.
دعم أنظمة قواعد بيانات متعددة — يعمل مع PostgreSQL، MySQL، SQLite، Oracle، وقواعد بيانات أخرى مدعومة من SQLAlchemy.
تثبيت وإعداد Alembic
تثبيت الحزمة
pip install alembic
للعمل مع التطبيقات غير المتزامنة (asyncio)، ستحتاج أيضاً إلى تثبيت تبعيات إضافية:
pip install alembic[asyncio]
تهيئة مشروع الترحيلات
بعد التثبيت، يجب تهيئة هيكل المشروع:
alembic init alembic
سينشئ الأمر الهيكل التالي للملفات:
alembic/
├── versions/ # دليل ملفات الترحيل
├── env.py # إعدادات البيئة
├── script.py.mako # قالب لتوليد الترحيلات
└── alembic.ini # ملف الإعدادات الرئيسي
إعداد الاتصال بقاعدة البيانات
في ملف alembic.ini، يتم تحديد رابط الاتصال بقاعدة البيانات:
sqlalchemy.url = postgresql://user:password@localhost/database_name
بدلاً من ذلك، يمكن إعداد الاتصال برمجياً في ملف env.py:
from sqlalchemy import create_engine
from myproject.config import DATABASE_URL
config.set_main_option("sqlalchemy.url", DATABASE_URL)
التكامل مع SQLAlchemy
ربط النماذج
لضمان عمل التوليد التلقائي للترحيلات بشكل صحيح، يجب تحديد بيانات النماذج الوصفية (metadata) في ملف alembic/env.py:
from myproject.models import Base
# تحديد البيانات الوصفية للتوليد التلقائي
target_metadata = Base.metadata
مثال لنموذج أساسي
from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(50), unique=True, nullable=False)
email = Column(String(100), unique=True, nullable=False)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.utcnow)