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

Флэк 101: добавление базы данных

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

В прошлый раз мы узнали, как настроить колбу. В этой статье мы узнаем, как добавить базу данных на наш веб-сайт музыки. Как вы можете вспомнить, Flask – это микро-веб-каркас. Это означает, что он не приходит с объектом Relational Mapper (ORM), как Django. Если вы хотите добавить интерактивность базы данных, то вам нужно добавить ее или установить расширение. Я лично люблю SQLalchemy Поэтому я подумал, что было приятно, что есть готовое расширение для добавления SQLALCHMEY на колбу под названием Flask-Sqlalchemy Отказ

Чтобы установить Flask-Sqlalchemy, вам просто нужно использовать PIP. Убедитесь, что вы находитесь в своей активированной виртуальной среде, которую мы создали в первой части этой серии, прежде чем выполнить следующее, или вы получите установку расширения на базовый Python вместо вашей виртуальной среды:

pip install flask-sqlalchemy

Теперь, когда у нас есть Flask-Sqlalchemy, установленная вместе с его зависимостями, мы можем начать создание базы данных!

Создание базы данных

Создание базы данных с SQLAlchemy на самом деле довольно легко. SQLalchemy поддерживает пару различных способов работы с базой данных. Мой любимый использует свой декларативный синтаксис, который позволяет создавать классы, которые моделируют саму базу данных. Поэтому я буду использовать это для этого примера. Мы будем использовать SQLite как нашу бэкэнду, однако мы могли бы легко изменить, что Backend к чему-то еще, например, MySQL или Postgres, если мы хотели.

Чтобы начать, мы посмотрим, как вы создаете файл базы данных, используя только обычную SQLALCHEMY. Затем мы создадим отдельный скрипт, который использует немного другой синтаксис Flask-SQLALCHEMY. Поместите следующий код в файл под названием db_creator.py.

# db_creator.py

from sqlalchemy import create_engine, ForeignKey
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref

engine = create_engine('sqlite:///mymusic.db', echo=True)
Base = declarative_base()


class Artist(Base):
    __tablename__ = "artists"

    id = Column(Integer, primary_key=True)
    name = Column(String)

    def __repr__(self):
        return "{}".format(self.name)


class Album(Base):
    """"""
    __tablename__ = "albums"

    id = Column(Integer, primary_key=True)
    title = Column(String)
    release_date = Column(String)
    publisher = Column(String)
    media_type = Column(String)

    artist_id = Column(Integer, ForeignKey("artists.id"))
    artist = relationship("Artist", backref=backref(
        "albums", order_by=id))

# create tables
Base.metadata.create_all(engine)

Первая часть этого кода должна выглядеть довольно известно всем, кто использует Python, как все, что мы делаем здесь, импортирует биты и куски, которые нам нужно от SQLALCHEMY, чтобы сделать оставшуюся часть работы кода. Тогда мы создаем SQLALCHEMY’S двигатель Объект, который в основном соединяет Python к базе данных выбора. В этом случае мы подключаем к SQLite и создавая файл вместо того, чтобы создавать базу данных в памяти. Мы также создаем «базовый класс», который мы можем использовать для создания декларативных определений классов, которые фактически определяют наши таблицы базы данных.

Следующие два класса определяют таблицы, которые мы заботимся о том, а именно Художник и Альбом Отказ Вы отметите, что мы называем таблицу через __tablename__ атрибут класса. Мы также создаем столбцы таблицы и устанавливаем их типы данных на все, что нам нужно. Класс альбома немного более сложнее, поскольку мы создаем отношения инострукций с таблицей художника. Вы можете узнать больше о том, как это работает в моем старее Учебное пособие SQLALCHEMY Или если вы хотите подробности подробности, затем проверьте хорошо написанные Документация Отказ

Когда вы запускаете код выше, вы должны получить что-то подобное в вашем терминале:

2017-12-08 18:36:43,290 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2017-12-08 18:36:43,291 INFO sqlalchemy.engine.base.Engine ()
2017-12-08 18:36:43,292 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2017-12-08 18:36:43,292 INFO sqlalchemy.engine.base.Engine ()
2017-12-08 18:36:43,294 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("artists")
2017-12-08 18:36:43,294 INFO sqlalchemy.engine.base.Engine ()
2017-12-08 18:36:43,295 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("albums")
2017-12-08 18:36:43,295 INFO sqlalchemy.engine.base.Engine ()
2017-12-08 18:36:43,296 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE artists (
    id INTEGER NOT NULL, 
    name VARCHAR, 
    PRIMARY KEY (id)
)


2017-12-08 18:36:43,296 INFO sqlalchemy.engine.base.Engine ()
2017-12-08 18:36:43,315 INFO sqlalchemy.engine.base.Engine COMMIT
2017-12-08 18:36:43,316 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE albums (
    id INTEGER NOT NULL, 
    title VARCHAR, 
    release_date DATE, 
    publisher VARCHAR, 
    media_type VARCHAR, 
    artist_id INTEGER, 
    PRIMARY KEY (id), 
    FOREIGN KEY(artist_id) REFERENCES artists (id)
)


2017-12-08 18:36:43,316 INFO sqlalchemy.engine.base.Engine ()
2017-12-08 18:36:43,327 INFO sqlalchemy.engine.base.Engine COMMIT

Теперь давайте сделаем всю эту работу в колбе!

Использование Flask-Sqlalchemy

Первое, что нам нужно сделать, когда мы ходим, чтобы использовать Flask-sqlalchemy, это создать простое сценарий приложений. Мы назовем это app.py Отказ Поместите следующий код в этот файл и сохраните его на MusicDB папка.

# app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mymusic.db'
app.secret_key = "flask rocks!"

db = SQLAlchemy(app)

Здесь мы создаем наше объект приложения Flask и скажу, где должен жить файл базы данных SQLALCHEMY. Мы также устанавливаем простой секретный ключ и создать объект DB, который позволяет нам интегрировать SQLALCHEMY в колбу. Далее нам нужно создать Models.py Файл и сохраните его в папку MusicDB. Как только вы сделаете это, добавьте следующий код:

# models.py 

from app import db


class Artist(db.Model):
    __tablename__ = "artists"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

    def __repr__(self):
        return "".format(self.name)


class Album(db.Model):
    """"""
    __tablename__ = "albums"

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String)
    release_date = db.Column(db.String)
    publisher = db.Column(db.String)
    media_type = db.Column(db.String)

    artist_id = db.Column(db.Integer, db.ForeignKey("artists.id"))
    artist = db.relationship("Artist", backref=db.backref(
        "albums", order_by=id), lazy=True)

Отметим, что FLASK-SQLALCHEMY не требует всего импорта, который требуется просто SQLALCHEMY. Все, что нам нужно, это объект DB, который мы создали в нашем скрипте приложений. Затем мы просто предварительно Pend «DB» на все классы, которые мы использовали в оригинальном коде SQLALCHEMY. Вы также отметите, что вместо создания базового класса он уже предварительно определен как db.model Отказ

Наконец, нам нужно создать способ инициализации базы данных. Вы могли бы поставить это в несколько разных мест, но я закончил создать файл, который я назвал db_setup.py и добавил следующее содержимое:

# db_setup.py

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///mymusic.db', convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()

def init_db():
    import models
    Base.metadata.create_all(bind=engine)

Этот код будет инициализировать базу данных с таблицами, которые вы создали в скрипте моделей. Чтобы получить инициализацию, давайте редактировать Test.py Сценарий от предыдущей статьи:

# test.py

from app import app
from db_setup import init_db

init_db()


@app.route('/')
def test():
    return "Welcome to Flask!"

if __name__ == '__main__':
    app.run()

Здесь мы просто импортировали наш объект приложения и функцию init_DB. Затем мы немедленно позвонили функцию init_DB. Чтобы запустить этот код, все, что вам нужно сделать, это запустить следующую команду в вашем терминале в папке MusicDB:

FLASK_APP=test.py flask run

Когда вы запустите это, вы не увидите, что вывод SQLALCHEMY, который мы видели ранее. Вместо этого вы просто увидите, что какая-то информация напечатана, заявив, что приложение вашей колбы запущено. Вы также найдете файл mymusic.db, был создан в вашей папке MusicDB.

Обратите внимание, что то init_db () Вызов не всегда работает, поэтому вам может потребоваться запустить скрипт DB_CREATOR I написал в предыдущей статье, если ваш файл базы данных SQLite не генерируется правильно.

Обертывание

На данный момент у вас сейчас есть веб-приложение с пустой базой данных. Вы не можете добавить что-либо в базу данных с вашим веб-приложением или посмотреть что-нибудь в базе данных. Да, вы только что создали что-то действительно классное, но это также совершенно бесполезно для ваших пользователей. В следующей статье мы узнаем, как добавить форму поиска для поиска данных в нашей пустой базе данных! Да, есть метод моего безумия, но вам придется прочитать серию, чтобы понять это.

Скачать код

Скачать Тарбол из кода из этой статьи: Flask-MusicDB-PATT_II.TAR

Другие статьи в серии

  • Часть I – Флэк 101: Начиная

Связанные показания