Рубрики
Без рубрики

Подключите колбу в базу данных с Flask-sqlalchemy

К настоящему времени вы наверняка знакомы с преимуществами библиотеки SQLachmy Python Salchemy: … Теги с колбой, Python, SQL, разработка программного обеспечения.

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

Когда мы запускаем наше приложение, мы должны увидеть следующее на главной странице:

У нас есть Liftoff!

Похоже, мы можем отображать существующие пользователи! Добавим еще несколько записей, чтобы убедиться, что все работает:

Я не могу поверить, что это не сообщение об ошибках. ™

Вот, возьми все мои вещи

Flack-Sqlalchemy – отличное, когда вы идете, но, как мы уже видели, «Настройка» не всегда ходьба в парке. Это одна из тех вещей, которые всегда, кажется, ошибаются, независимо от того, сколько раз вы это сделали из памяти.

Как преданный подарок, я поставил источник для этого руководства вверх на Github для вас, чтобы сокровиться и наслаждаться. Не серьезно, возьми. Убери меня от меня. Я закончил с колбой на сегодня. Мне нужно идти играть в какую-то ракетную лигу.

PS: добавь меня на PSN

Оригинал: “https://dev.to/hackersandslackers/connect-flask-to-a-database-with-flask-sqlalchemy-5d15”