English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
قد يكون تنفيذ عمليات CRUD على قاعدة البيانات باستخدام SQL الأصلي في تطبيقات Flask Web مملًا. بدلاً من ذلك، SQLAlchemt هو مكتبة قوية لـ OR Mapping توفر جميع الوظائف وال灵活性 لـ SQL للمطورين. Flask-SQLAlchemy هو إضافة لـ Flask تضيف دعم SQLAlchemy إلى تطبيق Flask.
ما هو ORM (الخريطة العكسية للأوبجكت-ريلاشين)؟
معظم منصات برمجة البرمجة موجهة إلى الكائنات. من ناحية أخرى، يتم تخزين البيانات في خوادم RDBMS على شكل جداول. هوك الأوبجكت-ريلاشين ماب هو تقنية تحويل بين بنية الكائنات وبنية جداول RDBMS. يوفر API ORM طرقًا لتنفيذ عمليات CRUD دون كتابة تعليمات SQL الأصلية.
في هذا الفصل، سنتعلم كيفية استخدام تقنية ORM في Flask-SQLAlchemy لبناء تطبيق Web صغير.
الخطوة 1 - قم بتثبيت إضافة Flask-SQLAlchemy.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 pip install flask-sqlalchemy
الخطوة 2 - يجب استيراد فئة SQLAlchemy من هذا الملف.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 from flask_sqlalchemy import SQLAlchemy
الخطوة 3 - الآن أنشئ كائن تطبيق Flask وتعيين URI للقاعدة التي تريد استخدامها.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'
الخطوة 4 - ثم أنشئ كائن تطبيق كمعامل لإنشاء كائن فئة SQLAlchemy. يحتوي هذا الكائن على وظائف مساعدة لعمليات ORM. كما يقدم فئة نموذج والوريثة التي تستخدمها لإنشاء نماذج المستخدمين المحددة. في قطعة الكود التالية، تم إنشاء نموذج طالب.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 db = SQLAlchemy(app) class students(db.Model): id = db.Column('student_id', db.Integer, primary_key = True) name = db.Column(db.String(100)) city = db.Column(db.String(50)) addr = db.Column(db.String(200)) pin = db.Column(db.String(10)) def __init__(self, name, city, addr, pin): self.name = name self.city = city self.addr = addr self.pin = pin
الخطوة 5 - لإنشاء/استخدام قاعدة البيانات المذكورة في URI، يرجى تشغيل طريقة create_all().
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 db.create_all()
يدير عميل جلسة SQLAlchemy جميع العمليات المستدامة للمثلية ORM.
تنفيذ هذه طرق الجلسة تؤدي إلى عمليات CRUD -
db.session.add(مثلية الهدف) - إضافة سجل إلى جدول الترابط db.session.delete(مثلية الهدف) - حذف سجلات من الجدول model.query.all() - استرجاع جميع السجلات من الجدول (يساوي استعلام SELECT).
يمكن استخدام خاصية filter لتطبيق مبدأ التصفية على مجموعة السجلات المكتشفة. على سبيل المثال، للبحث عن سجلات في جدول students حيث city ='Haikou'، استخدم التعبير التالي -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 Students.query.filter_by(city = 'Haikou').all()
بعد الحصول على هذه المعرفة المتقدمة، سنقدم لبرنامجنا دالة عرض لتسجيل بيانات الطلاب.
يُعتبر نقطة الدخول للنظام هي دالة show_all() الم绑定 إلى URL => ‘/‘. يتم إرسال مجموعة سجلات الطلاب كمعامل إلى نموذج HTML. يتم تقديم الكود الخلفي على الخادم بشكل جدول HTML في النموذج.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 @app.route('/') def show_all(): return render_template('show_all.html', students = students.query.all())
سكربت HTML النموذج ( show_all.html) كما يلي -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>مثال Flask</title> </head> <body> <h3> <a href = "{{ url_for('show_all') }}">قائمة الطلاب - Flask <a>مثال SQLAlchemy</a> </h3> <hr/> {%- for message in get_flashed_messages() %} {{ message }} {%- endfor %} <h3>الطلاب (<a href = "{{ url_for('new') }}">إضافة </a>)</h3> <table> <thead> <tr> <th>اسم</th> <th>مدينة</th> <th>عنوان</th> <th>Pin</th> </tr> </thead> <tbody> {% for student in students %} <tr> <td>{{ student.name }}</td> <td>{{ student.city }}</td> <td>{{ student.addr }}</td> <td>{{ student.pin }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
الصفحة العلوية تحتوي على رابط يوجه إلى URL:/new ينفذ دالة new()، النقر عليه يفتح استمارة معلومات الطالب. يتم نشر البيانات باستخدام طريقة POST إلى نفس URL.
ملف القالب: new.html كودها كما يلي -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>مثال Flask</title> </head> <body> <h3>معلومات الطلاب - مثال Flask SQLAlchemy</h3> <hr/> {%- for category, message in get_flashed_messages(with_categories = True) %} <div class = "alert alert-danger"> {{ message }} </div> {%- endfor %} <form action = "{{ request.path }}" method = "post"> <label for = "name">الاسم</label><br> <input type = "text" name = "name" placeholder = "الاسم" /><br> <label for = "email">مدينة</label><br> <input type = "text" name = "city" placeholder = "city" /><br> <label for = "addr">عنوان</label><br> <textarea name = "addr" placeholder = "addr"/><br> <label for = "PIN">مدينة</label><br> <input type = "text" name = "pin" placeholder = "pin" /><br> <input type = "submit" value = "إرسال" /> </form> </body> </html>
عندما يتم الكشف عن طريقة HTTP كPOST، يتم إدراج بيانات النموذج في جدول students، ويقوم التطبيق بالعودة إلى الصفحة الرئيسية التي تظهر البيانات.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 @app.route('/new', methods = ['GET', 'POST']) def new(): if request.method == 'POST': if not request.form['name'] or not request.form['city'] or not request.form['addr']: flash('رجاء إدخال جميع الحقول', 'error') else: student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin'])}} db.session.add(student) db.session.commit() flash('تم إضافة السجل بنجاح') return redirect(url_for('show_all')) return render_template('new.html')
فيما يلي يقدم لك كود التطبيق الكامل ( app.py)。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ar.oldtoolbag.com # Date : 2020-08-08 from flask import Flask, request, flash, url_for, redirect, render_template from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3' app.config['SECRET_KEY'] = "random string" db = SQLAlchemy(app) class students(db.Model): id = db.Column('student_id', db.Integer, primary_key = True) name = db.Column(db.String(100)) city = db.Column(db.String(50)) addr = db.Column(db.String(200)) pin = db.Column(db.String(10)) def __init__(self, name, city, addr, pin): self.name = name self.city = city self.addr = addr self.pin = pin @app.route('/') def show_all(): return render_template('show_all.html', students = students.query.all()) @app.route('/new', methods = ['GET', 'POST']) def new(): if request.method == 'POST': if not request.form['name'] or not request.form['city'] or not request.form['addr']: flash('رجاء إدخال جميع الحقول', 'error') else: student = students(request.form['name'], request.form['city'],request.form['addr'], request.form['pin']) print(student) db.session.add(student) db.session.commit() flash('تم إضافة السجل بنجاح') return redirect(url_for('show_all')) return render_template('new.html') if __name__ == '__main__': db.create_all() app.run(debug=True)
تشغيل السكربت من واجهة Python shell، وأدخل في المتصفح: http://localhost:5000/، سيتم عرض الناتج كما يلي -
انقر على “ إضافة”فتح نموذج معلومات الطلاب من خلال الرابط.
ملء النموذج وإرساله، سيتم عرض البيانات المرسلة على الصفحة الرئيسية. بعد الإجراء، سترى ما يلي من الناتج.