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

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

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

sqlite3 /tmp/flaskr.db < schema.sql

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

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

def init_db():
    with app.app_context():
        db = get_db()
        with app.open_resource('schema.sql', mode='r') as f:
            db.cursor().executescript(f.read())
        db.commit()

Итак, что же здесь происходит? Помните, как мы усваивали в предыдущем разделе, что контекст приложения создаётся всякий раз при появлении запроса? Здесь у нас пока ещё нет запроса, поэтому нам необходимо создать контекст приложения вручную. Без контекста приложения объект g не узнает, какому приложению он соответствует, ведь их может быть несколько!

Контекст приложения для нас устанавливает оператор with app.app_context(). В теле оператора with объект g будет проассоциирован с app. В конце оператора with ассоциация перестанет действовать, и будут запущены все функции разрыва контекста. Это значит, что после совершения действия соединение с базой данных будет разорвано.

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

Объект соединения, который предоставляет SQLite может дать нам объект курсора. Для этого курсора существует метод для выполнения целого скрипта. В самом конце нам нужно лишь совершить (фиксировать) изменения. SQLite 3 и другие транзакционные базы данных не зафиксируют изменения, если вы явно об этом их не попросите.

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

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

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

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

Продолжение: Шаг 5: Функции представления

Оригинал этой страницы