Шаг 3: Создание базы данных

Как было указано ранее, Flaskr это приложение с базой данных «под капотом», а если более точно, то приложение с системой на базе реляционной базы данных «под капотом». Такие системы нуждаются в схеме, котораясообщает им, как хранить информацию. Поэтому важно создать схему перед тем, как запустить в первый раз сервер.

Такая схема может быть создана с помощью перенаправления через канал (pipe) содержимого файла schema.sql команде sqlite3 следующим образом:

sqlite3 /tmp/flaskr.db < schema.sql

Недостатком такого способа является необходимость наличия в системе команды sqlite3, которая в некоторых системах может отсутствовать. Также, здесь указан путь к базе данных, что является ещё одной возможностью наделать ошибок. Хорошей идеей было бы добавить функцию, которая иициализировала бы для вашего приложения базу данных.

Если вы хотите это сделать, сначала необходимо импортировать функцию contextlib.closing() из пакета contextlib. Если вы хотите использовать Python 2.5, то необходимо также сначала добавить оператор with (импорты из __future__ должны быть самыми первыми импортами). Соответственно, добавьте в файле flaskr.py следующие строки к уже существующим импортам:

from __future__ import with_statement
from contextlib import closing

Далее, мы можем создать функцию с именем init_db, которая инициализирует базу данных. Для этого мы можем использовать функцию connect_db, которую мы определили ранее. Просто добавьте в flaskr.py после функции connect_db следующую функцию

def init_db():
    with closing(connect_db()) as db:
        with app.open_resource('schema.sql') as f:
            db.cursor().executescript(f.read())
        db.commit()

Функция-помощник (helper) closing() позволяет нам держать соединение открытым на протяжении блока with. Метод объекта приложения open_resource() поддерживает такую функциональность «из коробки», так что он может быть использован непосредственно внутри блока with. Эта функция открывает файл из папки, содержащей ресурсы (в нашем случае папка flaskr), и позволяет вам из него читать. Мы используем её здесь для того, чтобы выполнить скрипт при установлении соединения с базой данных.

Когда мы соединяемся с базой данных, мы получаем объект соединения (упоминается далее под именем db), который предоставляет нам курсор. У этого курсора есть метод для исполнения полноценного скрипта. И напоследок, нам всего лишь надо зафиксировать изменения. SQLite 3 и другие транзакционные базы данных не будут фиксировать изменения, если им это не будет указано в явной форме.

Теперь мы можем из командной оболочки Python импортировать и вызвать эту функцию, тем самым создав базу данных:

>>> from flaskr import init_db
>>> init_db()

Поиск и устранение возможных проблем

Если появилось исключение, что таблица не может быть найдена, проверьте, что вы назвали функцию init_db, и что имена ваших таблиц заданы корректным образом (проверьте, например, на отсутствие в именах ошибок, связанных с использованием единственного и множественного числа).

Продолжение: Шаг 4: Зарос соединения с базой данных