К настоящему времени вы наверняка знаком с преимуществами Python’s Библиотека SQLalchemy : Все в одном решении для в основном, связанной с базой данных. Как и большинство основных библиотек Python, SQLalchemy был перенесен в версию, специально совместимую с колбой, удачно по имени Flask-Sqlalchemy Отказ
Аналогичным на Core SQLALCHEMY PAUBLE, FLASK-SQLALCHEMY предоставляет нам ORM для изменения данных приложения, легко создавая определенные модели. Независимо от того, что может быть ваша база данных выбора, Flask-Sqlalchemy гарантирует, что модели, которые мы создаем в Python, переводятся на синтаксис нашей выбранной базы данных. Учитывая простоту использования и одноразличия – вся природа флэк-SQLALCHEMY, неудивительно, что библиотека была библиотекой баз данных де-факто для колбе с самого начала (серьезно, есть даже другой вариант ?)
Настройка FLASK-SQLALCHEMY для вашего приложения
Существует несколько важных переменных конфигурации, которые нам нужно установить аванс, прежде чем взаимодействовать с нашей базой данных. Как это стандартно, мы будем использовать класс, определенный в config.py Чтобы обработать нашу колбу Config:
from os import environ
class Config:
"""Set Flask configuration vars from .env file."""
# General
TESTING = environ["TESTING"]
FLASK_DEBUG = environ["FLASK_DEBUG"]
SECRET_KEY = environ.get('SECRET_KEY')
# Database
SQLALCHEMY_DATABASE_URI = environ.get("SQLALCHEMY_DATABASE_URI")
SQLALCHEMY_TRACK_MODIFICATIONS = environ.get("SQLALCHEMY_TRACK_MODIFICATIONS")
Здесь есть две переменные, которые специфичны для Flask-SqlAlchemy:
Sqlalchemy_database_uri : Строка подключения нам нужно подключиться к нашей базе данных. Это следует стандартной конвенции: [Db_type] + [db_connector]://[Имя пользователя]: [Пароль] @ [Хост]: [PORT]/[DB_NAME]
Sqlalchemy_echo: При установке «TRUE» FLASK-SQLALCHEMY будет регистрировать все активность базы данных в Стдерр Python для целей отладки.Sqlalchemy_track_modifications: Честно говоря, я просто всегда устанавливаю это на «False», в противном случае воплощенное предупреждение появляется каждый раз, когда вы запускаете свое приложение, напомнив вам, что эта опция принимает много системных ресурсов.
Это большие, о которых мы должны беспокоиться. Если вы в нем в следующем уровне базы данных базы данных, есть несколько других переменных конфигурации Pro-Mode, которую вы можете найти здесь Отказ
Используя точные соглашения о именовании для переменных выше, просто наличие их в нашем файле конфигурации, автоматически настроит наши соединения базы данных для нас. Нам никогда не придется создавать двигатели, сеансы или связи.
Инициирование флэк-SQLALCHEMY
Как всегда, мы собираемся использовать Флэк Применение Фабрика Метод для инициирования нашего приложения. Если вы не знакомы с термином, вы собираетесь найти этот учебник, чтобы запутать и в значительной степени бесполезной.
Самый основной __init__.py Файл для флэк-приложений с использованием Flask-SqlAlchemy должен выглядеть так:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
"""Construct the core application."""
app = Flask( __name__ , instance_relative_config=False)
db.init_app(app)
app.config.from_object('config.Config')
with app.app_context():
# Imports
from . import routes
# Create tables for our models
db.create_all()
return app
Обратите внимание на присутствие дБ и его местоположение: это наша база данных объекта устанавливается как глобальный Переменная за пределами create_app () Отказ Внутри create_app () С другой стороны, содержит линию db.init_app (приложение) Отказ Хотя мы установили наш объект DB глобально, это ничего не значит, пока мы не инициализируем его после создания нашего приложения. Мы достигли этого, позвонив init_app () в пределах create_app () и прохождение нашего приложения в качестве параметра. В рамках фактического «контекста приложений» – где мы позвоним create_all () , который мы покроем немного.
Если этот последний абзац звучал как Total Gibberish для вас, вы не одиноки. Фабрика приложения Flask является, пожалуй, одна из самых странных и плохо объясненных понятий в разработке программного обеспечения Python – мой лучший совет – не станет расстройством, возьми копию + вставной код выше, и слепо принять глупость, попадаю в глупость. вторая натура. Это то, что я сделал, и даже когда я работал через это руководство, я все еще столкнулся с отвратительными причудами, которые поймали меня без охранника.
Примите к сведению импорт, мы сделаем внутри контекста приложения, называемыми маршруты Отказ Это один из двух файлов, которые мы еще не написали: как только мы создадим их, наша структура файла приложения будет выглядеть что-то подобное:
my-app ├── /application │ ├── __init__.py │ ├── routes.py │ ├── models.py ├── .env ├── config.py └── wsgi.py
Создание моделей базы данных
Создать Models.py Файл в нашем каталоге приложений. Здесь мы импортируем дБ объект, который мы создали в __init__.py Отказ Теперь мы можем создавать модели базы данных, определяя классы в этом файле.
Общий пример будет начать с Пользователь модель. Первая переменная, которую мы создаем, это __tablename__ , который будет соответствовать названию таблицы SQL, новые пользователи будут сохранены. Каждая дополнительная переменная, которую мы создаем в этом классе модели, будут соответствовать столбцу в базе данных:
from . import db
class User(db.Model):
"""Model for user accounts."""
__tablename__ = 'users'
id = db.Column(db.Integer,
primary_key=True)
username = db.Column(db.String(64),
index=False,
unique=True,
nullable=False)
email = db.Column(db.String(80),
index=True,
unique=True,
nullable=False)
created = db.Column(db.DateTime,
index=False,
unique=False,
nullable=False)
bio = db.Column(db.Text,
index=False,
unique=False,
nullable=True)
admin = db.Column(db.Boolean,
index=False,
unique=False,
nullable=False)
def __repr__ (self):
return ''.format(self.username)
Каждый «столбец» принимает следующие атрибуты:
- Тип данных: Принимает одно из следующих:
Строка (размер),Текст,Datetime,Плавать,Логический,PickletypeилиБольшой. - Primary_key (Необязательно): при установке Правда , это поле будет служить первичным ключом в соответствующей таблице базы данных.
- Enorth_key (Необязательно): устанавливает внешние отношения ключей на поле в другой таблице. Целевой столбец должен иметь Уникальный ограничение для создания отношений между двумя таблицами.
- Уникальный (Необязательно): при установке Истинный Поле будет иметь уникальное ограничение, добавленное в базе данных.
- Nullable (Необязательно): ** ** Принимает логическое значение, которое указывает, может ли этот столбец принимать пустые значения.
С нашей первой моделью создана, вы уже приближаетесь к взаимодействию с вашей базой данных, чем вы можете подумать.
Protip: Модели SQLALCHEMY имеют несколько зарезервированных имен переменных, которые можно использовать для дальнейшей настройки соответствующих таблиц базы данных. Вот несколько примеров:
__tablename__: Установите имя полученной таблицы.__table_args__ = {"Схема": "My_name"}: Устанавливает схему Postgres, чтобы сохранить таблицу под.__table_args__ = {'extend_existing': true}: Указывает, что таблица с этим именем уже существует в целевой базе данных. Когда это установлено, ваша модель не будет переопределять существующие таблицы таким образом, возможно, что поля в вашей модели могут не совпадать с столбцами в вашей таблице.
Создание нашего первого пользователя
С нашей Пользователь Модель создана, у нас теперь есть то, что нам нужно для создания пользователей в нашей базе данных на лету. Здесь мы раскрыемся Маршруты .py и сделать простой маршрут для создания пользователя. Этот маршрут примет два параметра строки запроса: ? пользователь = примет имя пользователя и & eail = Примет адрес электронной почты:
from flask import request, render_template, make_response
from datetime import datetime as dt
from flask import current_app as app
from .models import db, User
@app.route('/', methods=['GET'])
def create_user():
"""Create a user."""
username = request.args.get('user')
email = request.args.get('email')
if username and email:
new_user = User(username=username,
email=email,
created=dt.now(),
bio="In West Philadelphia born and raised, on the playground is where I spent most of my days",
admin=False) # Create an instance of the User class
db.session.add(new_user) # Adds new User record to database
db.session.commit() # Commits all changes
return make_response(f"{new_user} successfully created!")
Проверьте, насколько это легко! Все, что нужно для создания пользователя, создает экземпляр класса пользователя, добавьте его на нашу сессию через db.session.add (new_user) и совершить изменения с db.session.commit () Действительно Это апелляция приложений для питания с базой данных ORM, как SQLalchemy: вместо того, чтобы беспокоить с обработкой операторов SQL, теперь мы можем управлять нашими данными, как будто они были объектами. В контексте построения приложения моделей данных дают нам безопасный, простой способ изменить данные.
new_user Переменная создает экземпляр Пользователь локально в памяти. Мы проходим аргументы ключевых слов, чтобы установить значения каждого поля в нашем классе ( имя пользователя , Эл. адрес , созданный и Био ).
db.session.add (new_user) Этапы нового пользователя, который мы только что создали, чтобы быть добавлены в базу данных. Как и в случае любого взаимодействия базы данных в Python, изменение на самом деле не будет совершено до тех пор, пока мы явно не дам ОК. В Flask-Sqlalchemy это делается через db.session.commit () Отказ
Запрос наших новых данных
Мы создали пользователь, но как мы можем убедиться, что дубликаты записей не созданы? С имя пользователя и Email поля имеют Уникальный Ограничение, наша база данных технически не позволит этому произойти. Если мы не добавим правильную проверку, попытайтесь вставить несколько уникальных значений в нашу таблицу, приведет к сбою приложения. Вместо того, чтобы разбиться, давайте построим приятное сообщение об ошибке!
from flask import request, render_template, make_response
from datetime import datetime as dt
from flask import current_app as app
from .models import db, User
@app.route('/', methods=['GET'])
def create_user():
"""Create a user."""
username = request.args.get('user')
email = request.args.get('email')
if username and email:
existing_user = User.query.filter(User.username == username or User.email == email).first()
if existing:
return make_response(f'{username} ({email}) already created!')
new_user = User(username=username,
email=email,
created=dt.now(),
bio="In West Philadelphia born and raised, on the playground is where I spent most of my days",
admin=False) # Create an instance of the User class
db.session.add(new_user) # Adds new User record to database
db.session.commit() # Commits all changes
return make_response(f"{new_user} successfully created!")
Прежде чем мы создадим новый пользователь, Существующие_user Переменные запросы нашей таблицы пользователей, чтобы увидеть, существует ли запись с предоставленной информацией. Чтобы запросить записи, которые принадлежат модели данных, мы пишем заявление, подобное это:
[MODEL].query.[METHOD_1].[METHOD_1].[FIRST or ALL]
[Модель] Наш название класса модели данных, которое мы следуем по этому поводу .QUERY Отказ Теперь мы можем построить запрос, используя ряд методов в нашем распоряжении:
Фильтр ([критерии]): Верните все записи, которые соответствуют данным критериям.order_by ([модель]. [колонна]): Сортировать возвращенные записи столбце.Получить ([Value]): Получить запись по его первичному ключу..ЛИМИТ ([целое число]): Установите максимальное количество записей для получения.
В нашем случае мы используем .Filter () Способ для получения существующих пользователей, которые уже имеют желаемое имя пользователя или электронное письмо (используем First () в нашем запросе вместо все () Потому что мы ожидаем максимум 1 запись). Если запись существует, мы доставляем ошибку пользователю:
myuser (myuser_972@example.com) already created!
Загрузка записей в шаблон
Для нашего окончательного трюка давайте посмотрим на нашу Jinja играет вместе с записями базы данных. Я изменил наш маршрут ниже, чтобы сделать шаблон под названием users.html Отказ Этот шаблон создаст HTML-страницу, которая перечисляет все существующие пользователи:
...
@app.route('/', methods=['GET'])
def create_user():
"""Create a user."""
...
users = User.query.all()
return render_template('users.html',
users=users,
title="Show Users")
Заявление User.query.all () вернется все экземпляры Пользователь в нашей базе данных. Мы проходим все эти записи в наш шаблон с Пользователи = пользователи Отказ Вот наш шаблон Jinja:
{% extends "layout.html" %}
{% block content %}
{% for user in users %}
- Username: {{ user.username }}
- Email: {{ user.email }}
- Created: {{ user.created }}
- Bio: {{ user.bio }}
- Admin: {{ user.admin }}
Когда мы запускаем наше приложение, мы должны увидеть следующее на главной странице:
У нас есть Liftoff!
Похоже, мы можем отображать существующие пользователи! Добавим еще несколько записей, чтобы убедиться, что все работает:
Я не могу поверить, что это не сообщение об ошибках. ™
Вот, возьми все мои вещи
Flack-Sqlalchemy – отличное, когда вы идете, но, как мы уже видели, «Настройка» не всегда ходьба в парке. Это одна из тех вещей, которые всегда, кажется, ошибаются, независимо от того, сколько раз вы это сделали из памяти.
Как преданный подарок, я поставил источник для этого руководства вверх на Github для вас, чтобы сокровиться и наслаждаться. Не серьезно, возьми. Убери меня от меня. Я закончил с колбой на сегодня. Мне нужно идти играть в какую-то ракетную лигу.
PS: добавь меня на PSN
Оригинал: “https://dev.to/hackersandslackers/connect-flask-to-a-database-with-flask-sqlalchemy-5d15”