Шаг 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: Функции представления