حل مشكلة تعريف العمود enum في SQLAlchemy مع PostgreSQL
عند استخدام تعريف العمود enum في SQLAlchemy مع PostgreSQL، يجب عليك تحديد اسم النوع في العمود وفي القاعدة بشكل منفصل. هذا يتيح للمهاجرة (migration) العمل بشكل صحيح. في حالتك، تحتاج إلى تعديل الكود المولد للمهاجرة لينشئ النوع الفعلي بشكل منفصل قبل إضافته كعمود في الجدول. يمكنك استخدام الكود التالي:
pythonfrom alembic import op
import sqlalchemy as sa
def upgrade():
banner_status_type = sa.Enum('active', 'inactive', 'archive', name='banner_status')
banner_status_type.create(op.get_bind())
op.add_column('banner', sa.Column('status', banner_status_type, nullable=True))
def downgrade():
op.drop_column('banner', 'status')
banner_status_type = sa.Enum('active', 'inactive', 'archive', name='banner_status')
banner_status_type.drop(op.get_bind())
هذا الكود يستخدم create
لإنشاء النوع banner_status
أولاً، ثم يقوم بإضافة العمود status
إلى الجدول. عند النزول في الإصدار (downgrade)، يتم حذف العمود ثم حذف النوع.
تأكد من تشغيل python manage.py db migrate
بعد التعديلات، ومن ثم استخدام python manage.py db upgrade
لتطبيق التغييرات على قاعدة البيانات.
يرجى مراجعة الرابط التالي لمزيد من المعلومات عن استخدام الأنواع enum في SQLAlchemy مع PostgreSQL:
Enum Types
المزيد من المعلومات
عند استخدام أنواع الـ enum في SQLAlchemy مع PostgreSQL، هناك بعض الأمور الهامة التي يجب مراعاتها:
-
اسم النوع (Type Name): يجب تحديد اسم النوع عند إنشائه في PostgreSQL. يتم تعريفه في المثال السابق باستخدام
name='banner_status'
. -
إضافة النوع قبل العمود: يجب إنشاء النوع قبل إضافته كعمود في الجدول. يتم ذلك باستخدام
banner_status_type.create(op.get_bind())
في الكود المولد للمهاجرة. -
حذف النوع قبل العمود: عند النزول في الإصدار (downgrade)، يجب حذف العمود ثم حذف النوع. يتم ذلك باستخدام
banner_status_type.drop(op.get_bind())
في الكود المولد للمهاجرة. -
تغيير قيم الـ enum: في حالة الحاجة لتغيير قيم الـ enum، يجب تحديث النوع وإعادة إنشائه وحذفه من الجدول قبل إعادة إضافته.
-
تحديث قيم الـ enum بعد التطبيق: بعد تطبيق التغييرات باستخدام
python manage.py db upgrade
، يمكنك تحديث قيم الـ enum في PostgreSQL عبر SQL مباشرة في حالة الحاجة. -
رموز الخطأ المحتملة: إذا واجهت مشكلة مع اسم النوع غير موجود (type does not exist)، فقد يكون السبب هو عدم إنشاء النوع بشكل صحيح قبل إضافته كعمود.
باستخدام هذه النصائح، يمكنك استخدام أنواع الـ enum بنجاح في SQLAlchemy مع PostgreSQL وتجنب مشاكل النوع غير موجود أو غير معرف.