Модель Flask

Концепция Моделей
Разработка и описание моделей FLask
Для построения моделей базы данных рассмотрим расширение Flask-SQLAlchemy. Это расширение предоставляет удобную для Flask оболочку для популярного пакета SQLAlchemy. ORM позволяют приложениям управлять базой данных, используя высокоуровневые сущности, такие как классы, объекты и методы, вместо таблиц и SQL запросов.

SQLAlchemy поддерживает длинный список механизмов баз данных, включая популярные MySQL , PostgreSQL и SQLite .

Работа ORM заключается в преобразовании высокоуровневых операций в команды базы данных.

Команда установки Flask-SQLAlchemy:

pip install flask-sqlalchemy
описание полей
Для настройки расширения и подключения базы данных необходимо указать параметры

Расширение Flask-SQLAlchemy берет расположение базы данных приложения из SQLALCHEMY_DATABASE_URI переменной конфигурации (хорошей практикой является установка конфигурации из переменных среды и предоставление резервного значения, когда среда не определяет переменную).
В этом случае URL-адрес базы данных берется из DATABASE_URL переменной среды.

Опция SQLALCHEMY_TRACK_MODIFICATIONS конфигурации настроена False. Данная функция указывает (True) необходимость отправки сигнала приложению каждый раз, когда в базу данных должно быть внесено изменение.

Файл конфигурации config.py
import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config(object):
    # ...
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
Описание модели данных
Класс User наследуется от db.Model, базового класса для всех моделей от Flask-SQLAlchemy. Этот класс определяет несколько полей как переменные класса. Поля создаются как экземпляры db.Column класса, который принимает тип поля в качестве аргумента, а также другие необязательные аргументы, которые позволяют указать, различные параметры и ограничения.

Метод __repr__ сообщает Python, как печатать объекты этого класса, это полезно для отладки.
Модель данных User
from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))

    def __repr__(self):
        return '<User {}>'.format(self.username)
Типы столбцов
Integer - целое число
String(size) - строка
Text - длинный текст юникода
DateTime - дата и время, выраженные как datetime объект Python.
Float - значение с плавающей точкой
Boolean - логическое значение
LargeBinary - двоичные данные
Параметры столбца
primary_key - указывает поле идентификатор таблицы
unique - указывает, должно ли поле быть уникальным
index - создает индексированное поле
backref - объявляет свойство для обратной связи с классом.
nullable - указывает, может ли поле оставаться пустым
Отношения
«один-ко- многим»
Наиболее распространенными отношениями данных в таблице являются отношения «один ко многим».

Поскольку отношения объявляются до того, как они будут установлены, вы можете использовать строки для ссылки на классы, которые еще не созданы





Внешний ключ должен быть объявлен отдельно с ForeignKey классом:
Модель данных со связью "Один-ко-многим"
from datetime import datetime
from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return '<User {}>'.format(self.username)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(140))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Post {}>'.format(self.body)
Отношения
«многие-ко-многим»
Необходимо определить вспомогательную таблицу, которая будет использоваться для этого отношения. Для этой вспомогательной таблицы настоятельно рекомендуется использовать не модель, а реальную таблицу:





Для этой вспомогательной таблицы рекомендуется использовать не модель, а реальную таблицу:
Модель данных со связью "Один-ко-многим"
tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),
    db.Column('page_id', db.Integer, db.ForeignKey('page.id'), primary_key=True)
)

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tags = db.relationship('Tag', secondary=tags, lazy='subquery',
        backref=db.backref('pages', lazy=True))

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)