Alembic: ترحيل قواعد البيانات في Python

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة

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

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)

توصيات