К настоящему времени вы наверняка знаком с преимуществами 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”