К настоящему времени вы, несомненно, знакомы с преимуществами основной библиотеки SQLALCHEMY Python: все в одном решении для всего, что связано с базой данных. Как и большинство основных библиотек Python, SQLalchemy была перенесена в версию, специально совместимую с колкой, удачно названной Flask-Sqlalchemy .
Подобно основному пакету SQLalchemy, Flask-Sqlalchemy предоставляет нам ORM для легкости изменения данных приложения с помощью определенных моделей. Независимо от того, какой может быть выбранная ваша база данных, Flask-Sqlalchemy гарантирует, что модели, которые мы создаем в Python, будут переведены в синтаксис нашей выбранной базы данных. Учитывая простоту использования и универсальный характер Flask-Sqlalchemy, неудивительно, что библиотека была фактической библиотекой базы данных для Flask с самого начала (серьезно, есть ли еще один вариант ?)
Настройка Flask-Sqlalchemy для вашего приложения
Существует несколько важных переменных конфигурации, которые мы должны настроить заранее, прежде чем взаимодействовать с нашей базой данных. Как стандартно, мы будем использовать класс, определенный в config.py
Для обработки нашей конфигурации колбы:
import os class Config: """Set Flask configuration vars from .env file.""" # General TESTING = os.environ["TESTING"] FLASK_DEBUG = os.environ["FLASK_DEBUG"] # Database SQLALCHEMY_DATABASE_URI = os.environ["SQLALCHEMY_DATABASE_URI"] SQLALCHEMY_ECHO = os.environ["SQLALCHEMY_ECHO"] SQLALCHEMY_TRACK_MODIFICATIONS = os.environ["SQLALCHEMY_TRACK_MODIFICATIONS"]
Давайте разберем их:
Sqlalchemy_database_uri
: Строка подключения, которую мы должны подключиться к нашей базе данных. Это следует за стандартной конвенцией:[db_type]+[db_connector]://[username]: [пароль]@[host]: [port]/[db_name]
Sqlalchemy_echo
: Когда установлено в «True», Flask-Sqlalchemy будет регистрировать все действия базы данных в STDERR Python в целях отладки.Sqlalchemy_record_queries
: Честно говоря, я просто всегда устанавливал это на «ложь», в противном случае непрерывное предупреждение появляется каждый раз, когда вы запускаете свое приложение, напоминая вам, что этот вариант занимает много системных ресурсов.
Это большие, о которых мы должны беспокоиться. Если вы увлекаетесь каким-то дерьмом базы данных следующего уровня, есть несколько других переменных конфигурации Pro-Mode, которые вы можете найти здесь .
Используя точные соглашения об именах для переменных выше, просто наличие их в нашем файле конфигурации автоматически настраивает наши подключения к базе данных для нас. Нам никогда не придется создавать двигатели, сеансы или соединения.
Инициирование Flask-Sqlalchemy с нашим приложением
Как всегда, мы собираемся использовать Флеска приложений Метод завода Для начала нашего приложения. Если вы не знакомы с этим термином, вы обнаружите, что этот учебник сбивает с толку и в значительной степени бесполезно.
Самый простой __init__.py
Файл для приложений Flask с использованием 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 # Initialize Global db db.create_all() return app
Обратите внимание на наличие дБ
и его местоположение: этот наш объект базы данных устанавливается как Глобальный переменная за пределами create_app ()
Анкет Внутри create_app ()
, с другой стороны, содержит линию db.init_app (app)
Анкет Несмотря на то, что мы установили наш объект DB по всему миру, это ничего не означает, пока мы его не инициализируем его после создания нашего приложения. Мы достигаем этого, позвонив init_app ()
внутри create_app ()
и передача нашего приложения в качестве параметра. В реальном «контексте приложения» мы позвоним create_all ()
, что мы немного рассмотрим.
Если этот последний абзац звучал как Total Gibberish для вас, Ты не одинок. Фабрика приложений Flask, пожалуй, одна из самых странных и плохо объясненных концепций в разработке программного обеспечения Python- Мой лучший совет не разочарован, возьмите код Copy + Paste выше и слепо принимайте чушь, кормившуюся ложку, достаточно раз, пока он не станет второй натурой. Это то, что я сделал, и даже когда я работал над этим учебником, я все еще наткнулся на отвратительные причуды, которые поймали меня с самостоятельной.
Обратите внимание на импорт, который мы делаем внутри контекста приложения, называемого Маршруты Анкет Это один из двух файлов, которые мы еще не написали: как только мы создаем их, наша структура файла приложений будет выглядеть примерно так:
my-app ├── /application │ ├── __init__.py │ ├── routes.py │ ├── models.py ├── .env ├── config.py └── wsgi.py
Создание моделей баз данных
Создать модели.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
,Float
ВЛогический
,Pickletype
, илиБольшой
Анкет - primary_key : Независимо от того, должен ли столбец служить основным ключом.
- уникальный : Будь то применение уникальных значений для столбца.
- Nullable: Обозначает необходимые поля.
С нашей первой созданной моделью вы уже намного ближе к взаимодействию с вашей базой данных, чем вы думаете.
Создание нашей первой записи
Давайте создадим пользователя в нашем routes.py
файл.
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 entry(): """Endpoint to create a user.""" new_user = User(username='myuser', email='myuser@example.com', created=dt.now(), bio="In West Philadelphia born and raised, on the playground is where I spent most of my days", admin=False) db.session.add(new_user) db.session.commit() return make_response("User created!")
Проверьте, как это легко! Все, что нужно для создания пользователя, – это создать экземпляр Пользователь
класс из модели.py
, добавить его в нашу сеанс через db.session.add (new_user)
и совершить изменения с db.session.commit ()
! Посмотрим, что произойдет, когда мы запустим это приложение:
Подожди, что, черт возьми?
Помните, когда я сказал, что фабрика заявок Фласки как ад? Мы только что разблокировали особое достижение: настройка конфигурации VAR для вещей, которых еще не существует.
Вернемся, когда мы установим Sqlalchemy_echo
и Sqlalchemy_track_modifications
в config.py
Мы на самом деле совершали вводящую в заблуждение ошибку. Посмотри на __init__.py
И вы заметите, что наш экземпляр Flask-Sqlalchemy установлен до того, как мы создадим наше приложение. С тех пор db ()
приходит раньше Имя приложения)
Мы смутили дерьмо из нашего приложения. По сути, здесь мы установили переменные конфигурации для расширения колбы, чего еще не существует, что дает нам это загадочное сообщение об ошибке KeyError: Верно
Анкет
Шокирующе, очень немногие люди в Интернете имеют объяснение для этого. Серьезно: что вы делаете, люди? Все строят свои приложения для колбы неправильно? В любом случае, мы исправляем эту проблему в __init__.py
:
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) app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False app.config["SQLALCHEMY_ECHO"] = True db.init_app(app) app.config.from_object('config.Config') with app.app_context(): # Imports from . import routes # Initialize Global db db.create_all() return app
Вместо настройки Sqlalchemy_echo
и Sqlalchemy_track_modifications
в config.py
, теперь мы их устанавливаем после Наше приложение создано и после Наш объект DB создан. Обязательно удалите оба Sqlalchemy_echo
и Sqlalchemy_track_modifications
от config.py
.
Теперь это исправит наше приложение для запуска следующего:
User Created!
Запрос наших новых данных
Создание информации – это допинг, но как мы можем подтвердить, что она существует? Я добавил несколько вещей, чтобы routes.py
Чтобы показать нам, что случилось:
from flask import request, render_template from datetime import datetime as dt from flask import current_app as app from .models import db, User @app.route('/', methods=['GET']) def entry(): """Endpoint to create a user.""" new_user = User(username='myuser', email='myuser@example.com', created=dt.now(), bio="In West Philadelphia born and raised, on the playground is where I spent most of my days", admin=False) db.session.add(new_user) db.session.commit() 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 }}
Когда мы запустим наше приложение, мы должны увидеть следующее на домашней странице:
У нас есть подъем!
Похоже, мы можем отображать существующих пользователей! Давайте добавим еще несколько записей, чтобы убедиться, что все работает:
Я не могу поверить, что это не сообщения об ошибках. ™
Здесь, возьми все мои вещи
Конечно, Flask-Sqlalchemy-это здорово, как только вы начинаете, но, как мы уже видели «настройку»,-это не всегда прогулка в парке. Это одна из тех вещей, которые всегда кажется неверным, независимо от того, сколько раз вы делали это из памяти.
В качестве прощального подарка я разместил источник для этого урока на GitHub, чтобы вы затрагивали и наслаждались. Нет серьезно, возьми это Анкет Убери от меня. Я закончил с Флэком на сегодня. Мне нужно пойти сыграть какую -то ракетную лигу.
PS: добавьте меня на PSN
Оригинал: “https://dev.to/hackersandslackers/manage-database-models-with-flask-sqlalchemy-22n8”