تخزين البيانات
معظم تطبيقات فلاسك ستتعامل مع تخزين البيانات في مرحلةٍ ما. يوجد العديد من الطرق المختلفة لفعل ذلك. إيجاد الطريقة الأفضل يعتمد بشكل كبير على نوع البيانات الذي تريد تخزينه. فإذا كنت تريد تخزين بيانات علائقية (مثال: مستخدم لديه منشورات، والمنشورات لديها مستخدم أنشأها)، فاستخدام قاعدة بيانات علائقية من المرجح سيكون أفضل (أليس هذا جلياً!). الأنواع الأخرى من البيانات قد يلائمها أن تُخزَّن في قاعدة بيانات NoSQL، مثل MongoDB.
لن أخبرك بطريقة حتى تختار فيها محرك قاعدة البيانات المناسب لتطبيقك. هناك بعض الأشخاص سيخبروك أن قاعدة بيانات NoSQL هي الطريقة الوحيدة المناسبة لك والبعض سيقولون المثل عن قواعد البيانات العلائقية. كل ما سأخبرك به حيال هذا الموضوع هو إن لم تكن مُتأكِداً، فقاعدة البيانات العلائقية (مثل MySQL أو PostgreSQL) ستعمل - تقريباً - مع أياً ما تقوم به.
إضافة لذلك، إذا استخدمت قاعدة بيانات علائقية، فسيمكنك العمل مع إضافة SQLAlchemy وهذه الإضافة ممتعة.
إضافة SQLAlchemy
إضافة SQLAlchemy هي مُطابِقة علاقات كائنية (ORM - Object Relational Mapper). هي بالأساس طبقة تجريد (abstraction layer) مبنية على رأس استعلامات SQL الخام التي يتم إجراؤها على قاعدة بياناتنا. توفر هذه الإضافة واجهة برمجية متوافقة مع قائمة كبيرة من محركات قواعد البيانات. المحركات الأكثر شعبية منها MySQL و PostgreSQL و SQLite. هذا يجعل من السهل نقل البيانات بين نماذجنا (models) وقواعد البيانات ويجعل من السهل حقاً القيام بأمور أخرى مثل التنقل بين محركات قواعد البيانات وترحيل (migrate) مخططات (schemas) قواعد البيانات.
يوجد إضافة رائعة لفلاسك تجعل استخدام SQLAlchemy أسهل تدعى بـ Flask-SQLAlchemy. تقوم هذه الإضافة بإعداد العديد من الإعدادات الإفتراضية لـ SQLAlchemy. كما تتولى بعض أعمال إدارة الجلسة وبالتالي لن نضطر إلى التعامل مع أمور الحماية في شيفرة تطبيقك.
دعنا نتعمق بكيفية استخدام هذه الإضافة في الشيفرة. سنقوم بتعريف بعض النماذج ومن ثم إعداد SQLAlchemy. ستوضع النماذج في الملف myapp/models.py، ولكن بدايةً سنقوم بتعريف قاعدة البيانات في الملف myapp/__init__.py.
# ourapp/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__, instance_relative_config=True)
app.config.from_object('config')
app.config.from_pyfile('config.py')
db = SQLAlchemy(app)
اولاً، قمنا باستهلال وإعداد التطبيق (الكائن app
) ومن ثم استخدمناه لاستهلال معالج قاعدة بيانات SQLAlchemy. سنقوم باستخدام المجلد الحالِي لإعداد قواعد البيانات وبالتالي ينبغي علينا استخدام الخيار instance_relative_config
عند استهلال التطبيق واستدعاء app.config.from_pyfile
لتحميل المجلد. ومن ثم يمكننا تعريف نماذجنا.
# ourapp/models.py
from . import db
class Engine(db.Model):
# Columns
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(128))
thrust = db.Column(db.Integer, default=0)
الأصناف Column
، و Integer
، و String
، و Model
وغيرها من أصناف (classes) إضافة SQLAlchemy متوافرة بواسطة الكائن db
المنُشأ (constructed) من إضافة FLask-SQLAlchemy. قمنا بتعريف نموذج لتخزين الحالة الحالية لمحركات مركبتنا الفضائية. كل محرك يملك رقم تعريف (id)، وعنوان (title)، ومستوى دفع (thrust level).
مازلنا بحاجة لإضافة بعض معلومات قاعدة البيانات إلى ملف إعداداتنا. نحن نستخدم المجلد الحالِي لإبقاء متغيرات الإعداد السرية خارج نظام التحكم بالإصدارات، لذلك سنضع تلك المعلومات في الملف instance/config.py.
# instance/config.py
SQLALCHEMY_DATABASE_URI = "postgresql://user:password@localhost/spaceshipDB"
ملاحظة
يختلف عنوان قاعدة بياناتك بناءً على المحرك الذي تستخدمه ومكان تواجده. طالع توثيق SQLAlchemy حول الصيغة الكتابية لعنوان قاعدة البيانات.
إنشاء قاعدة البيانات
الآن بعد أن قمنا بإعداد قاعدة البيانات وتعريف النموذج، يمكننا إنشاء قاعد البيانات. تتضمن هذه الخطوة إنشاء قاعدة البيانات اعتماداً على مخطط النماذج المُعرفِة.
عادةً قد تكون هذه العملية مزعجة. ولكن لحسن الحظ، توفر إضافة SQLAlchemy أمر رائع يقوم بكل شيء لنا.
دعنا نفتح مُفسر بايثون من الطرفية في جذر المستودع.
$ pwd
/Users/me/Code/myapp
$ workon myapp
(myapp)$ python
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from myapp import db
>>> db.create_all()
>>>
الآن - شكراً لإضافة SQLAlchemy - تم إنشاء جميع الجداول في قاعدة البيانات المحددة في ملف الإعداد.
أداة Alembic
مخطط قاعدة البيانات ليس جامداً (لا يتغير). على سبيل المثال، قد ترغب بإضافة العمود last_fired
إلى محرك الجدول. إذا كنت لا تملك أية بيانات، فيمكنك تحديث النموذج وتشغيل الأمر ()db.create_all
مجدداً. ولكن ماذا لو كنت نملك بيانات مُسجلة من ستة أشهر في ذلك الجدول؟! أنت غالباً لا تريد حذف كل ذلك والبدء من الصفر. لذلك جاءت آلية الترحيل لحل تلك المشكلة.
برمجية Alembic هي أداة ترحيل قواعد بيانات أُنشئَت خصيصاً للعمل مع SQLAlchemy. تتيح لنا هذه الأداة الاحتفاظ بسجل يُصدَر من مخطط قاعدة بيانات حتى نتمكن من تحديث المخطط لاحقاً أو حتى الرجوع إلى إصدار أقدم.
تمتلك أداة Alembic دورة شاملة لتبدأ معها، لذلك سأعطيك لمحة سريعة فقط وسأشير إلى بضعة أشياء عليك تعلمها.
سننشئ "بيئة الترحيل (migration environment)" باستخدام الأمر alembic init
. حالما نقوم بتشغيل هذا الأمر في جذر المستودع سينتُج دليل جديد باسم خَلاَّق (واضح) وهو alembic. سيصبح مستودعنا بعد ذلك مماثل للمثال أدناه (المأخوذ من دورة Alembic).
ourapp/
alembic.ini
alembic/
env.py
README
script.py.mako
versions/
3512b954651e_add_account.py
2b1ae634e5cd_add_order_id.py
3adcc9a56557_rename_username_field.py
myapp/
__init__.py
views.py
models.py
templates/
run.py
config.py
requirements.txt
يحوي الدليل /alembic برمجيات تقوم بترحيل بياناتنا بين الإصدارات. كما يوجد أيضاً الملف alembic.ini والذي يحوي معلومات الإعداد.
ملاحظة
أضف الملف alembic.ini إلى الملف .gitignore ستقوم بالاحتفاظ ببيانات اعتماد قاعدة البيانات في هذا الملف، لذلك أنت لا تريد بالتأكيد وضعه في نظام التحكم بالإصدارات.
عندما يحين موعد تحديث المخطط فهناك بضعة خطوات علينا القيام بها. أولاً يجب علينا تنفيذ الأمر alembic revision
لتوليد برمجية الترحيل. ومن ثم علينا فتح ملف بايثون المولد حديثاً في المسار /myapp/alembic/versions وملء دوال upgrade
و downgrade
باستخدام الأدوات التي يوفرها الكائن op
.
حالما تصبح برمجية الترحيل جاهزة، يمكننا تشغيل الأمر alembic upgrade head
لترحيل بياناتنا إلى الإصدار الأحدث.
ملاحظة
للمزيد من التفاصيل حول إعداد أداة Alembic، وإنشاء برمجية الترحيل، وتشغيل عملية الترحيل، طالع دورة Alembic.
تحذير
لا تنسى وضع خطة عملية لعمل نسخة احتياطية لبياناتك. هذا الموضوع خارج إطار الكتاب، ولكن ينبغي دائماً أن تكون قاعدة بياناتك محفوظة بطريقة آمنة وقوية.
ملاحظة
قواعد بيانات NoSQL أقل استقراراً مع فلاسك، ولكن طالما يملك محرك قواعد البيانات الذي اخترته مكتبة لبايثون، فينبغي أن تكون قادراً على استخدامه. يوجد حتى عدة إضافات فلاسك في سجل إضافات فلاسك تساعدك على استخدام محركات NoSQL مع فلاسك.
الخلاصة
- استخدم SQLAlchemy للعمل مع قواعد البيانات العلائقية.
- استخدم إضافة Flask-SQLAlchemy للعمل مع SQLAlchemy.
- تساعدك أداة Alembic على ترحيل بياناتك بين تغييرات المخططات.
- يمكنك استخدام قواعد بيانات NoSQL مع فلاسك، ولكن الطرق والأدوات متباينة تبعاً للمحرك المستخدم.
- احرص على إنشاء نسخة احتياطية لبياناتك.