.. _tutorial-dbinit: Шаг 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() Итак, что же здесь происходит? Помните, как мы усваивали в предыдущем разделе, что контекст приложения создаётся всякий раз при появлении запроса? Здесь у нас пока ещё нет запроса, поэтому нам необходимо создать контекст приложения вручную. Без контекста приложения объект :data:`~flask.g` не узнает, какому приложению он соответствует, ведь их может быть несколько! Контекст приложения для нас устанавливает оператор ``with app.app_context()``. В теле оператора with объект :data:`~flask.g` будет проассоциирован с ``app``. В конце оператора with ассоциация перестанет действовать, и будут запущены все функции разрыва контекста. Это значит, что после совершения действия соединение с базой данных будет разорвано. Метод :func:`~flask.Flask.open_resource` объекта приложения является удобной функцией-помощником, которая откроет ресурс, обеспечиваемый приложением. Эта функция открывает файл из места расположения ресурсов (в нашем случае папка `flaskr`), и позволяет вам из него читать. Мы используем её здесь для того, чтобы выполнить скрипт при установлении соединения с базой данных. Объект соединения, который предоставляет SQLite может дать нам объект курсора. Для этого курсора существует метод для выполнения целого скрипта. В самом конце нам нужно лишь совершить (фиксировать) изменения. SQLite 3 и другие транзакционные базы данных не зафиксируют изменения, если вы явно об этом их не попросите. Теперь мы можем из командной оболочки Python импортировать и вызвать эту функцию, тем самым создав базу данных:: >>> from flaskr import init_db >>> init_db() .. admonition:: Поиск и устранение возможных проблем Если появилось исключение, что таблица не может быть найдена, проверьте, что вы назвали функцию `init_db`, и что имена ваших таблиц заданы корректным образом (проверьте, например, на отсутствие в именах ошибок, связанных с использованием единственного и множественного числа). Продолжение: :ref:`tutorial-views` `Оригинал этой страницы `_