English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Использование исходного SQL для выполнения операций CRUD в веб-приложении Flask может быть скучным. Вместо этого Python-библиотека SQLAlchemy - это мощный OR-маппер, который предоставляет все функции и гибкость SQL разработчикам приложений. Flask-SQLAlchemy - это расширение Flask, которое добавляет поддержку SQLAlchemy в приложение Flask.
Что такое ORM (объектно-реляционное отображение)?
Большинство платформ программирования являются объектно-ориентированными. С другой стороны, данные в серверах RDBMS хранятся в виде таблиц. Объектно-реляционное отображение (ORM) - это технология, которая позволяет параметризовать объекты на уровне структуры таблиц баз данных RDBMS. ORM API предоставляет методы для выполнения операций CRUD, не требуя написания исходных SQL-запросов.
В этом разделе мы изучим использование ORM-технологии Flask-SQLAlchemy и построим небольшой веб-приложение.
Шаг 1 - Установите расширение Flask-SQLAlchemy.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.oldtoolbag.com # Date : 2020-08-08 pip install flask-sqlalchemy
Шаг 2 - Необходимо импортировать класс SQLAlchemy из этого модуля.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.oldtoolbag.com # Date : 2020-08-08 from flask_sqlalchemy import SQLAlchemy
Шаг 3 - Теперь создайте объект приложения Flask и установите URI для используемой базы данных.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.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 : ru.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 : ru.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 : ru.oldtoolbag.com # Date : 2020-08-08 Students.query.filter_by(city='Haikou').all()
С таким уровнем знаний мы предоставим нашему приложению функцию-представление для добавления данных о студентах.
Пunkt входа в приложение - функция show_all(), привязанная к URL => ‘/‘. Сборник записей о студентах отправляется в HTML-шаблон. Серверный код в шаблоне представляется в виде таблицы HTML.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.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) так</h3>
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.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> <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(). После нажатия на нее открывается форма информации о студенте. Данные отправляются на этот же URL методом POST.
файл шаблона: new.html код следующий -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.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 = "Name" /><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 : ru.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 : ru.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/, результат будет следующим -
Нажмите на “ ДобавитьОткройте форму информации о студенте по ссылке.
Заполните форму и отправьте ее,主页将列出提交ленные данные. После выполнения операции, вы увидите следующий результат.