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

Управление моделями баз данных с Flask-Sqlalchemy

К настоящему времени вы, несомненно, знакомы с преимуществами основной библиотеки SQLALCHEMY Python: All-in-One … Tagged Flask, Python, SQL, разработка программного обеспечения.

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

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

У нас есть подъем!

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

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

Здесь, возьми все мои вещи

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

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

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

Оригинал: “https://dev.to/hackersandslackers/manage-database-models-with-flask-sqlalchemy-22n8”