Cоздайте и интегрируйте базу данных MySQL с приложением Flask
MySQL — это широко используемая реляционная база данных с открытым исходным кодом, известная своей производительностью, надежностью и масштабируемостью. Он подходит для различных типов программных приложений, включая веб-приложения, платформы электронной коммерции и системы управления контентом.
В этой статье вы узнаете, как создать и интегрировать базу данных MySQL с приложением Flask с помощью драйвера PyMySQL, который обеспечивает удобный доступ к базам данных MySQL в рамках Flask.
Предварительные требования
В вашей системе должны быть установлены Python, Flask и MySQL, а также иметь базовое представление о платформе Flask, шаблонах Jinja и SQL.
Установить пакет PyMySQL
Прежде чем продолжить работу с этим руководством, у вас должен быть установлен пакет PyMySQL в среде вашего проекта.
Чтобы установить пакет PyMySQL в локальной или виртуальной среде, откройте окно терминала и введите следующую команду. Он будет использоваться для создания и подключения базы данных MySQL к вашему приложению Flask.
pip install PyMySQL
Создание базы данных MySQL с использованием PyMySQL
Библиотека PyMySQL упрощает взаимодействие с базами данных MySQL
. Он позволяет приложениям Python подключаться к базам данных MySQL и манипулировать ими. В этом разделе вы будете использовать библиотеку PyMySQL для создания базы данных MySQL.
В отличие от базы данных SQLite, вам необходимо установить username, password и hostname базы данных MySQL, используя ключи конфигурации.
import pymysql
hostname = 'localhost'
user = 'root'
password = 'your_password'
# Initializing connection
db = pymysql.connections.Connection(
host=hostname,
user=user,
password=password
)
# Creating cursor object
cursor = db.cursor()
# Executing SQL query
cursor.execute("CREATE DATABASE IF NOT EXISTS books_db")
cursor.execute("SHOW DATABASES")
# Displaying databases
for databases in cursor:
print(databases)
# Closing the cursor and connection to the database
cursor.close()
db.close()
Библиотека pymysql
импортирована и будет использоваться для подключения к серверу MySQL и создания базы данных.
Соединение с сервером MySQL инициализируется с использованием объекта pymysql.connections.Connection
с необходимыми учетными данными, такими как имя хоста, имя пользователя и пароль. Затем экземпляр сохраняется внутри переменной db.
Объект курсора базы данных создается и сохраняется внутри переменной курсора для взаимодействия с базой данных MySQL.
Первый запрос SQL создает базу данных books_db на сервере MySQL, если такой базы данных не существует.
Второй запрос SQL использует оператор SHOW DATABASES для получения списка баз данных на сервере MySQL. Затем выходные данные этого запроса повторяются и печатаются.
В конце концов, курсор и соединение с базой данных закрываются с помощью cursor.close()
и db.close()
соответственно.
('books_db',)
('information_schema',)
('mysql',)
('performance_schema',)
('sakila',)
('sys',)
('world',)
Как видно из выходных данных, на сервере MySQL создается база данных с именем books_db
.
Интеграция базы данных MySQL с приложением Flask
В этом разделе вы научитесь интегрировать базу данных MySQL с вашим приложением Flask и создавать модель с помощью SQLAlchemy.
Приложение Flask и настройка SQLALchemy
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
# Creating Flask app
app = Flask(__name__)
# Creating SQLAlchemy instance
db = SQLAlchemy()
Приведенный выше код импортирует класс Flask, а также методы и функции render_template
, request
, redirect
и url_for
модуля flask
. Затем SQLAlchemy импортируется из модуля flask_sqlalchemy
.
Вам необходимо установить библиотеку Flask-SQLAlchemy, если вы еще не установили. Запустите команду pip install Flask-SQLAlchemy
в своем терминале, чтобы установить эту зависимость.
Приложение Flask создается путем создания экземпляра класса Flask со значением __name__
и сохранения его в переменной приложения.
Экземпляр SQLAlchemy (SQLAlchemy()
) создается и сохраняется внутри переменной db
.
Настройка URI подключения к базе данных MySQL
user = "root"
pin = "your_password"
host = "localhost"
db_name = "books_db"
# Configuring database URI
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{user}:{pin}@{host}/{db_name}"
# Disable modification tracking
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Сначала определяются параметры подключения к базе данных. Эти переменные хранят параметры подключения к базе данных, такие как имя пользователя MySQL (user)
, пароль MySQL (pin)
, hostname (host)
и имя базы данных (db_name)
для подключения.
Cледующая строка кода настраивает URI базы данных SQLAlchemy для подключения к базе данных MySQL. URI разбивается следующим образом:
mysql+pymysql://
: это означает, что нужно использовать драйвер PyMySQL.
username
: здесь указывается имя пользователя, которое будет заменено значением пользовательской переменной.
password
: он будет заменен значением переменной pin.
hostname
: оно будет заменено значением переменной хоста.
database_name
: оно будет заменено значением переменнойdb_name
.
В конце концов, отслеживание изменений отключается с помощью конфигурации app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
.
Инициализация приложения Flask с помощью SQLAlchemy
# Initializing Flask app with SQLAlchemy
db.init_app(app)
Экземпляр SQLAlchemy (db
) инициализируется с помощью метода init_app()
с приложением Flask (app
).
Создание модели базы данных
# Creating Models
class Books(db.Model):
__tablename__ = "books"
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(500), nullable=False, unique=True)
author = db.Column(db.String(500), nullable=False)
Код создает класс модели SQLAlchemy (Books), который представляет таблицу базы данных. __tablename__
указывает имя таблицы (книг).
В таблице создаются три столбца: идентификатор, заголовок и автор. Функция db.Column
используется для определения столбцов базы данных.
id
: столбецid
имеет целочисленный тип (db.Integer
) и является первичным ключом (primary_key=True
), что означает, что он будет уникальным для каждой строки.
title
: имеет строковый тип (db.String
), его нельзя оставить пустым (nullable=False
) и он будет содержать уникальные значения (unique=True
).
author
: Он имеет строковый тип (db.String
) и не может оставаться пустым (nullable=False
).
Создание таблицы в базе данных MySQL
def create_db():
with app.app_context():
db.create_all()
Приведенный выше код определяет функцию create_db()
, которая используется для создания таблицы (books
) в базе данных MySQL (books_db
). Приложение Flask (app
) запускается в контексте приложения внутри этой функции, чтобы гарантировать, что оно имеет доступ к приложению Flask и его конфигурации.
В блоке контекста метод create_all()
вызывается в экземпляре SQLAlchemy (db
) для создания таблицы, определенной классом модели SQLAlchemy (Books
).
Работа с базой данных — добавление данных с помощью приложения Flask
Теперь, когда база данных и таблица MySQL созданы, пришло время проверить, работают ли они и можно ли добавлять данные в базу данных. Вы можете сделать это вручную с помощью MySQL Workbench или других приложений, но вы можете сделать это программно с помощью инфраструктуры Flask во внешнем интерфейсе.
Создание внутренней логики
# Home route
@app.route("/")
def home():
details = Books.query.all()
return render_template("home.html", details=details)
# Add data route
@app.route("/add", methods=['GET', 'POST'])
def add_books():
if request.method == 'POST':
book_title = request.form.get('title')
book_author = request.form.get('author')
add_detail = Books(
title=book_title,
author=book_author
)
db.session.add(add_detail)
db.session.commit()
return redirect(url_for('home'))
return render_template("books.html")
Приведенный выше код определяет два маршрута Home
и Add data
для отображения и добавления сведений о книге.
Домашний маршрут:
- Пользователь может получить доступ к домашнему маршруту, используя корневой URL-адрес «/», и когда пользователь обращается к корневому URL-адресу, выполняется функция home().
- Используя
Books.query.all()
, функцияhome()
извлекает все записи из таблицы базы данных.
- Переменная Details затем используется для передачи всех записей в шаблон
home.html
, после чего шаблон визуализируется.
Добавить данные Маршрут:
- Пользователи могут добавлять данные в таблицу базы данных, посетив URL-адрес «
/add
», который принимает запросы GET и POST.
- Когда пользователи вводят URL-путь или отправляют запрос GET, отображается шаблон
book.html
, который включает форму с двумя полями.
- Определена функция
add_books()
, и эта функция обрабатывает POST-запрос пользователя.
- Метод
request.form.get()
используется для получения значения заголовка и автора из формы, которое затем передается в поля таблицы базы данных (заголовок и автор).
- Затем с помощью метода
db.session.add()
все сведения добавляются в базу данных, а изменения фиксируются в базе данных MySQL с помощью методаdb.session.commit()
.
- Когда все это будет выполнено, пользователи будут перенаправлены на домашнюю страницу с помощью метода
url_for()
.
Запуск сценария
if __name__ == "__main__":
create_db()
app.run(debug=True)
Приведенный выше код вызовет функцию create_db(), которая создаст таблицу в базе данных, а app.run() запустит приложение Flask на локальном сервере.
Однако сначала вы должны создать HTML-шаблон для внешнего интерфейса.
Создание внешнего интерфейса с использованием BootStrap
Создайте каталог с именем templates в корне каталога вашего проекта и внутри этого каталога создайте три HTML-файла:
base.html
home.html
books.html
Используя шаблон Jinja
, будут отображены данные из базы данных.
base.html
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<title>{% block title%} {% endblock %}</title>
</head>
<body>
{% block content %} {% endblock %}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
</body>
</html>
Этот HTML-файл содержит Bootstrap CSS и JavaScript CDN (сеть доставки контента). Вы можете увидеть некоторые шаблоны Jinja
, предназначенные для внедрения контента в раздел тела и динамический заголовок без повторного использования базовой структуры HTML.
home.html
{% extends 'base.html' %}
{% block title %}
Home of Books
{% endblock %}
{% block content %}
<h1 class="text-center my-5">📚Books Detail📚</h1>
<div class="container d-flex justify-content-center align-items-center">
<a class="btn btn-outline-info mb-3" href="{{ url_for('add_books') }}">Add Books</a>
</div>
<div class="container">
<table class="table table-dark table-striped">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Book Title</th>
<th scope="col">Author</th>
</tr>
</thead>
{% if not details%}
<div class="text-center">
<h3 class="my-5">No Records to Display!</h3>
</div>
{% else %}
<tbody>
{% for data in details %}
<tr>
<th scope="row">{{data.id}}</th>
<td>{{data.title}}</td>
<td>{{data.author}}</td>
</tr>
{% endfor %}
</tbody>
{% endif %}
</table>
</div>
{% endblock %}
В этом шаблоне шаблон base.html используется в качестве макета с использованием {% extends 'base.html' %}
, а заголовок страницы задается с помощью блока заголовка, а внутри блока контента данные, хранящиеся в базе данных (details
), повторяются и отображается в формате таблицы с использованием Bootstrap.
books.html
{% extends 'base.html' %}
{% block title %}
Add Books
{% endblock %}
{% block content %}
<h1 class="text-center my-5">📚Book Details📚</h1>
<div class="container">
<a href="{{ url_for('home') }}" class="btn mb-3 btn-outline-info">Go to Home</a>
<form action="/add" method="POST">
<div class="mb-3">
<label for="title" class="form-label">Title</label>
<input type="text" class="form-control" name="title" id="title" placeholder="Title of the book" required>
</div>
<div class="mb-3">
<label for="author" class="form-label">Author</label>
<input type="text" class="form-control" name="author" id="author" placeholder="Author of the book">
</div>
<button type="submit" class="btn mt-3 btn-outline-success">Add Book</button>
</form>
</div>
{% endblock %}
Этот HTML-файл содержит форму с двумя полями ввода («Название» и «Автор») и кнопкой отправки («Добавить книгу»). Эта форма будет отправлена по URL-адресу «/add
» (action="/add
), а «method="POST"
» указывает, какой HTTP-метод POST
будет использоваться.
Добавление данных с помощью внешнего интерфейса
Запустите файл app.py или другое имя, которое вы назвали основным файлом приложения Flask, и перейдите по адресу http://localhost:5000
, чтобы получить доступ к интерфейсу.
Вы увидите домашнюю страницу без записей, как показано на изображении ниже. Сначала необходимо ввести данные по URL-адресу «/add
» или нажать кнопку «Добавить книгу» на главной странице.
На этой странице вы вводите информацию о своей книге и отправляете форму. Представленная информация будет внесена в базу данных.
После нажатия кнопки «Добавить книгу» вы попадете на домашнюю страницу, где отобразятся введенные вами данные.
Заключение
Драйвер PyMySQL используется в этом руководстве для подключения к серверу MySQL и создания базы данных MySQL после подключения к серверу MySQL путем выполнения необработанного SQL-запроса.
Затем приложение Flask определяет строку URI подключения к базе данных, и SQLAlchemy инициализируется с помощью приложения Flask.
Затем SQLAlchemy используется для создания таблицы в базе данных объектно-ориентированным способом с использованием класса Python. Backend предназначен для обработки операций с базой данных, а внешний интерфейс предназначен для добавления данных в базу данных MySQL и отображения их на домашней странице.