создание приложений баз данных python
Базы данных и их использование в приложениях на Python
В данной статье мы рассмотрим, что такое базы данных и какие из них чаще всего используются, если речь идет о разработке на Python.
Пожалуй, начнем с определения. База данных – это абстракция над файловой системой операционной системы, которая значительно упрощает создание приложений, создающих, читающих, обновляющих и удаляющих различные данные.
Зачем нужны базы данных?
На высоком уровне веб-приложения хранят данные и представляют их пользователям в удобном виде. Например, Google хранит данные о дорогах и предоставляет маршруты для проезда из одного места в другое при каждом использовании вами Google Maps. Строить такие маршруты движения возможно благодаря тому, что данные хранятся в структурированном формате.
Базы данных делают структурированное хранилище надежным и быстрым. Они также дают представление о том, как данные должны сохраняться и извлекаться. В результате, создавая каждое новое приложение, вы не обдумываете заново, что делать с данными.
Для управления созданием и использованием баз данных создано много реализаций СУБД — систем управления базами данных. Примеры СУБД — PostgreSQL, MySQL, SQLite. Также существуют нереляционные базы данных — NoSQL.
Марк Лутц «Изучаем Python»
Скачивайте книгу у нас в телеграм
Реляционные базы данных
В веб-разработке на Python чаще всего используются реляционные базы данных.
В этих базах данные хранятся в виде серии таблиц. Взаимосвязи между таблицами создаются при помощи внешних ключей. (Само определение «реляционные» происходит от англ. relations — «связи, отношения», — прим. перев.)
Внешний ключ – это уникальная ссылка из одной строки в реляционной таблице на другую строку, которая чаще всего находится в другой таблице, хотя может быть и в той же самой.
Реализации хранилищ баз данных различаются по сложности. SQLite — СУБД, встроенная в Python — создает один файл для всех данных каждой базы данных.
Другие СУБД, такие как PostgreSQL, MySQL, Oracle и Microsoft SQL Server, имеют более сложные схемы хранения. Кроме того, они предлагают дополнительные расширенные функции, полезные для хранения данных веб-приложений. Например:
Обычно веб-приложения начинаются с одного экземпляра базы данных, например PostgreSQL, с простой схемой. Со временем схема базы данных превращается в более сложную структуру с использованием миграций. При этом возрастает потребность в расширенных функциях, таких как репликация, сегментирование и мониторинг, поскольку использование базы данных становится более интенсивным.
Наиболее распространенные базы данных для веб-приложений на Python
PostgreSQL и MySQL – две наиболее распространенные базы данных с открытым исходным кодом для хранения данных веб-приложений на Python.
SQLite – это база данных, которая хранится в одном файле на диске. SQLite встроена в Python, но предназначена только для доступа по одному соединению за раз. Поэтому настоятельно рекомендуется не запускать производственное веб-приложение с SQLite. Эта база данных хороша для учебных проектов, когда вы только осваиваете, как всё работает.
Для продакшена же лучше использовать PostgreSQL или MySQL, или другую базу данных, в том числе нереляционную – всё зависит от специфики вашего приложения.
База данных PostgreSQL
PostgreSQL – это рекомендуемая реляционная СУБД для работы с веб-приложениями на Python. Функционал PostgreSQL, его активное развитие и улучшение, а также стабильность послужили причиной использования этой СУБД в бэкенде миллионов приложений, существующих сегодня в сети.
База данных MySQL
MySQL – еще одна практичная реализация СУБД для приложений, написанных на Python. Имеет открытый исходный код.
MySQL проще в освоении, чем PostgreSQL, но не так богата функциями.
Подключение к базе данных с помощью Python
Для работы с реляционной базой данных с использованием Python нужны библиотеки. Наиболее распространенные библиотеки для реляционных баз данных:
Поддержка SQLite встроена во все версии Python 2.7+, поэтому отдельная библиотека для подключения не требуется. Просто импортируйте sqlite3 ( import sqlite3 ), и можно начинать работатьтоirметоyey.
Объектно-реляционное отображение
Объектно-реляционное отображение (англ. object-relational mapping, ORM) позволяет разработчикам получать доступ к данным из бэкенда при помощи Python-кода, а не SQL-запросов. Все структуры веб-приложений по-разному обрабатывают интеграцию ORM. По объектно-реляционному отображению есть множество ресурсов, так что вы без проблем разберетесь в этой теме.
Размещение баз данных на стороннем сервере
Многие компании предлагают свои серверы для хостинга баз данных. В услугах, предоставляемых такими компаниями, часто есть автоматическое резервное копирование и восстановление, усиленные настройки безопасности и простое вертикальное масштабирование.
Полезные источники для изучения баз данных
Для того, чтобы хорошенько разобраться в базах данных, вам потребуется немало времени для изучения различных книг и туториалов. Ниже вы можете ознакомиться со списком книг и видеокурсов по данной тематике.
Книги для изучения баз данных:
Видеокурсы:
Если же вы больше предпочитаете видеоуроки и курсы, то существует множество источников для любого уровня подготовки. Ниже приведены примеры таких источников. Они в основном рассчитаны для новичков:
Контрольный чеклист для изучения баз данных
Заключение
В этой статье мы кратко рассказали про базы данных в Python. Обсудили, какие они бывают и в чем особенности использования той или иной СУБД. Также мы дали вам подборки книг и видеоматериалов для дальнейшего изучения баз данных. Надеемся, что вам все это пригодится. Успехов в освоении баз данных и написании кода!
Создание веб-приложения с использованием Python Flask и MySQL
Russian (Pусский) translation by Yuri Yuriev (you can also view the original English article)
В этой серии мы будем использовать Python, Flask и MySQL для создания простого веб-приложения с нуля. Это будет приложение списка дел, в котором пользователи смогут зарегистрироваться, подписаться и создать свой список желаний.
Введение в Python Flask
Установка Flask
Установить Flask легко и просто. С менеджером пакетов pip нужно сделать только:
Теперь определим основной путь / и соответствующий ему обработчик запросов:
Затем проверьте, является ли исполняемый файл главной программой и запустите приложение:
Сохраните изменения и выполните app.py :
Укажите браузеру на http://localhost:5000/ и у вас должно появиться приветственное сообщение.
Создание домашней страницы
Во-первых, при запуске приложения мы должны показать домашнюю страницу с последними элементами списка дел, добавленными пользователями. Итак, добавим нашу домашнюю страницу в папку приложения.
Измените основной метод, чтобы вернуть созданный файл шаблона.
Сохраните изменения и перезапустите сервер. Указав браузеру http://localhost:5000/ вы увидите следующее:
Создание страницы регистрации
Шаг 1. Настройка базы данных
Введите требуемый пароль и при входе в систему выполните следующую команду для создания базы данных:
Шаг 2. Создание интерфейса регистрации
В app.py добавьте метод showSignUp для отображения страницы регистрации после поступления запроса в /showSignUp :
Сохраните изменения и перезапустите сервер. Нажмите кнопку Sign Up на главной странице и у вас должна получиться такая страница регистрации:
Шаг 3. Внедрение метода регистрации
Чтобы прочитать опубликованные значения, нам нужно импортировать request из Flask.
С помощью request мы прочитаем значения, как показано ниже:
Как только значения прочитаны, мы проверяем, верны ли они, а пока давайте вернём простое сообщение:
Шаг 4. Создание запроса на регистрацию
Итак, давайте присоединим событие нажатия кнопки, как показано:
Сохраните изменения и перезапустите сервер. На странице Sign Up заполните данные и нажмите Sign Up. Проверьте браузер, у вас должно получиться следующее сообщение:
Шаг 5: вызов хранимой процедуры MySQL
Импортируйте MySQL внутрь app.py :
Ранее мы определили наше приложение:
Наряду с этим, включая следующие конфигурации MySQL:
Сначала давайте создадим соединение MySQL:
Когда соединение установлено, нам понадобится cursor для запроса stored процедуры. Через conn соединение создаём курсор.
Перед вызовом stored процедуры, давайте сделаем надёжный пароль с помощником от Werkzeug. Импортируйте модуль в app.py :
Используйте модуль для создания хэшированного пароля.
Теперь вызываем процедуру sp_createUser :
Если процедура выполнена успешно, мы зафиксируем изменения и вернем сообщение об успешном завершении.
Подводя итоги
Исходный код к этому уроку доступен на GitHub.
Как подружить Python и базы данных SQL. Подробное руководство
Все приложения взаимодействуют с данными, чаще всего через систему управления базами данных (СУБД). Одни языки программирования поставляются с модулями для работы с СУБД, другие требуют использования сторонних пакетов. Из этого подробного руководства вы узнаете о различных библиотеках Python для работы с SQL-базами данных. Мы разработаем простое приложение для взаимодействия с БД SQLite, MySQL и PostgreSQL.
Примечание. Если вы не разбираетесь в базах данных, советуем обратить внимание на следующие публикации Библиотеки программиста: 11 типов современных баз данных, SQL за 20 минут, Подборка материалов для изучения баз данных и SQL.
Из этого пособия вы узнаете:
Чтобы получить максимальную отдачу от этого учебного пособия, необходимо знать основы Python, SQL и работы с СУБД. Вы также должны иметь возможность загружать и импортировать пакеты в Python и знать, как устанавливать и запускать серверы БД локально или удаленно.
В каждом разделе по три подраздела: SQLite, MySQL и PostgreSQL.
1. Схема базы данных для обучения
В этом уроке мы разработаем очень маленькую базу данных приложения для социальных сетей. База данных будет состоять из четырех таблиц:
Схема базы данных показана на рисунке ниже.
2. Подключение к базам данных
Примечание. Для выполнения разделов о MySQL и PostgreSQL необходимо самостоятельно запустить соответствующие серверы. Для быстрого ознакомления с тем, как запустить сервер MySQL, ознакомьтесь с разделом MySQL в публикации Запуск проекта Django (англ.). Чтобы узнать, как создать базу данных в PostgreSQL, перейдите к разделу Setting Up a Database в публикации Предотвращение атак SQL-инъекций с помощью Python (англ.).
SQLite
SQLite, вероятно, является самой простой базой данных, к которой можно подключиться с помощью Python, поскольку для этого не требуется устанавливать какие-либо внешние модули. По умолчанию стандартная библиотека Python уже содержит модуль sqlite3.
Более того, SQLite база данных не требует сервера и самодостаточна, то есть просто читает и записывает данные в файл. Подключимся с помощью sqlite3 к базе данных:
Вот как работает этот код:
MySQL
Обратите внимание, что MySQL – это серверная система управления базами данных. Один сервер MySQL может хранить несколько баз данных. В отличие от SQLite, где соединение равносильно порождению БД, формирование базы данных MySQL состоит из двух этапов:
Определим функцию, которая будет подключаться к серверу MySQL и возвращать объект подключения:
Вот как выглядит эта функция:
Создадим базу данных sm_app для нашего приложения на сервере MySQL:
PostgreSQL
Как и в случае MySQL, для PostgreSQL в стандартной библиотеке Python нет модуля для взаимодействия с базой данных. Но и для этой задачи есть решение – модуль psycopg2 :
Определим функцию create_connection() для подключения к базе данных PostgreSQL:
Запустив вышеприведенный скрипт, мы увидим базу данных sm_app на своем сервере PostgreSQL. Подключимся к ней:
Здесь 127.0.0.1 и 5432 это соответственно IP-адресу и порт хоста сервера.
3. Создание таблиц
В предыдущем разделе мы увидели, как подключаться к серверам баз данных SQLite, MySQL и PostgreSQL, используя разные библиотеки Python. Мы создали базу данных sm_app на всех трех серверах БД. В данном разделе мы рассмотрим, как формировать таблицы внутри этих трех баз данных.
Как обсуждалось ранее, нам нужно получить и связать четыре таблицы:
SQLite
Примечание. Описываемый далее скрипт – часть того же файла, в котором мы описали соединение с базой данных SQLite.
Итак, начнем с определения функции execute_query() :
Теперь напишем передаваемый запрос ( query ):
В запросе говорится, что нужно создать таблицу users со следующими пятью столбцами:
Следующий запрос используется для создания таблицы posts:
Наконец, формируем следующим скриптом таблицы comments и likes :
MySQL
Описываем таблицу users :
Запрос для реализации отношения внешнего ключа в MySQL немного отличается от SQLite. Более того, MySQL использует ключевое слово AUTO_INCREMENT для указания столбцов, значения которых автоматически увеличиваются при вставке новых записей.
PostgreSQL
Применение библиотеки psycopg2 в execute_query() также подразумевает работу с cursor :
Мы можем использовать эту функцию для организации таблиц, вставки, изменения и удаления записей в вашей базе данных PostgreSQL.
Создадим внутри базы данных sm_app таблицу users :
4. Вставка записей
В предыдущем разделе мы разобрали, как развертывать таблицы в базах данных SQLite, MySQL и PostgreSQL с использованием различных модулей Python. В этом разделе мы узанем, как вставлять записи.
SQLite
Вставим в таблицу posts шесть записей:
Следующий скрипт вставляет записи в таблицы comments и likes :
MySQL
Посмотрите на следующий пример, который вставляет две записи в таблицу likes :
PostgreSQL
Следующий скрипт вставляет записи в таблицу posts :
5. Извлечение данных из записей
SQLite
SELECT
Давайте выберем все записи из таблицы users :
Примечание. Не рекомендуется использовать SELECT * для больших таблиц, так как это может привести к большому числу операций ввода-вывода, которые увеличивают сетевой трафик.
Результат вышеприведенного запроса выглядит следующим образом:
Таким же образом вы можете извлечь все записи из таблицы posts :
Вывод выглядит так:
Вы также можете выполнять более сложные запросы, включающие операции типа JOIN для извлечения данных из двух связанных таблиц. Например, следующий скрипт возвращает идентификаторы и имена пользователей, а также описание сообщений, опубликованных этими пользователями:
Следующий скрипт возвращает все сообщения вместе с комментариями к сообщениям и именами пользователей, которые разместили комментарии:
Вывод выглядит так:
Вывод выглядит так:
WHERE
MySQL
Процесс выбора записей в MySQL абсолютно идентичен процессу выбора записей в SQLite:
Теперь выберем все записи из таблицы users :
Вывод будет похож на то, что мы видели с SQLite.
PostgreSQL
Опять же, результат будет похож на то, что мы видели раньше.
6. Обновление записей таблицы
SQLite
Увидим следующий вывод:
Следующий скрипт обновит описание:
То есть запись была обновлена.
MySQL
Процесс обновления записей в MySQL с помощью модуля mysql-connector-python является точной копией модуля sqlite3 :
PostgreSQL
Запрос на обновление PostgreSQL аналогичен SQLite и MySQL.
7. Удаление записей таблицы
SQLite
В качестве примера удалим комментарий с id равным 5:
Заключение
Однако это лишь вершина айсберга! Существуют также библиотеки для работы с SQL и объектно-реляционными отображениями, такие как SQLAlchemy и Django ORM, которые автоматизируют задачи взаимодействия Python с базами данных.
Если вам интересна тематика работы с базами данных с помощью Python, напишите об этом в комментариях – мы подготовим дополнительные материалы.
Встроенная база данных Python
Aug 26, 2020 · 5 min read
Если вы разработчик программного обеспечения, то, скорее всего, вы знакомы с невероятно легкой базой данных SQLite или даже уже использовали ее. Она содержит практически все функции реляционной базы данных и представлена всего одним файлом. На официальном сайте можно найти несколько сценариев применения SQLite:
Если вам нужна SQLite для каких-либо других целей, то обратитесь к документации.
Но самое главное — SQLite встроена в библиотеку Python. То есть вам не нужно устанавливать серверное или клиентское ПО и поддерживать работу какого-либо сервиса. Если вы импортировали библиотеку в Python и приступили к работе, значит вы уже используете систему управления реляционными базами данных!
Импортирование и использование
«В с троенность» предполагает, что вам не нужно запускать pip install для получения библиотеки. Просто импортируйте ее с помощью:
Создание соединения с БД
Не беспокойтесь о драйверах, строках подключения и т.д. Вы можете создать базу данных SQLite и задать такой простой объект подключения, как:
После запуска этой строки кода происходит создание с БД и активируется подключение к ней. Дело в том, что базы данных, к которой мы просим подключиться Python, не существует, поэтому он автоматически создает пустую. Также мы можем ввести точно такой же код для подключения к уже существующей базе данных.
Создание таблицы
Теперь создадим таблицу:
После запуска этого кода создается таблица, но она ничего не выводит.
Включение записей
Предположим, мы хотим вставить сразу несколько записей. Выполним:
После запуска кода не появилось никаких предупреждений, значит все прошло успешно.
Запрос к таблице
Пришло время удостовериться, что все сделано правильно. Выполним запрос к таблице на возврат образцов строк.
Как видите, все очень просто!
Более того, несмотря на свою легкость SQLite является широко используемой базой данных, и большинство программного обеспечения клиентов SQL ее поддерживает.
Чаще всего я использую инструмент DBeaver. Рассмотрим его на примере.
Подключение к базе данных SQLite из клиента SQL (DBeaver)
Поскольку я использую Google Colab, я буду загружать файл my-test.db на свой компьютер. При запуске Python на локальном компьютере можно использовать клиент SQL для прямого подключения к файлу баз данных.
Создаем новое соединение в DBeaver и выбираем SQLite в качестве типа БД:
А вы знаете о том, что в Python есть встроенная СУБД?
Если вы — программист, то я полагаю, что вы, наверняка, знаете о существовании чрезвычайно компактной и нетребовательной к ресурсам СУБД SQLite, или даже пользовались ей. Эта система обладает практически всеми возможностями, которых можно ожидать от реляционной СУБД, но при этом всё хранится в единственном файле. Вот некоторые сценарии использования SQLite, упомянутые на официальном сайте этой системы:
Импорт модуля
Создание подключения к БД
Для организации подключения к базе данных SQLite не нужно беспокоиться об установке драйверов, о подготовке строк подключения и о прочих подобных вещах. Создать базу данных и получить в своё распоряжение объект подключения к ней можно очень просто и быстро:
Выполнив эту строку кода, мы создадим базу данных и подключимся к ней. Дело тут в том, что база данных, к которой мы подключаемся, пока не существует, поэтому система автоматически создаёт новую пустую БД. Если же база данных уже создана (предположим, это my-test.db из предыдущего примера), для того чтобы к ней подключиться, достаточно воспользоваться точно таким же кодом.
Файл только что созданной базы данных
Создание таблицы
Теперь давайте создадим таблицу в нашей новой БД:
Если этот код функционирует так, как ожидается (вышеприведённая команда, правда, ничего не возвращает), в нашем распоряжении окажется таблица, готовая к дальнейшей работе с ней.
Вставка записей в таблицу
Представим, что нам нужно добавить в таблицу несколько записей одной командой. В SQLite сделать это очень просто:
Сообщений об ошибках после выполнения этого кода не поступает, а это значит, что данные успешно добавлены в таблицу.
Выполнение запросов к базе данных
Теперь пришло время узнать о том, правильно ли отработали команды, которые мы только что выполняли. Давайте выполним запрос к БД и попробуем получить из таблицы USER какие-то данные. Например — получим записи, относящиеся к пользователям, возраст которых не превышает 22 года:
Результат выполнения запроса к БД
Как видите, то, что было нужно, получить удалось. И сделать это было очень просто.
Кроме того, даже хотя SQLite — простая СУБД, она отличается крайне широкой поддержкой. Поэтому с ней можно работать, используя большинство SQL-клиентов.
Я пользуюсь DBeaver. Предлагаю взглянуть на то, как это выглядит.
Подключение к базе данных SQLite из SQL-клиента (DBeaver)
Я пользуюсь облачным сервисом Google Colab и хочу загрузить файл my-test.db на свой компьютер. Если же вы экспериментируете с SQLite на компьютере, то это значит, что вы, без необходимости скачивать откуда-то файл базы данных, можете подключиться к ней, используя SQL-клиент.
В случае с DBeaver для подключения к БД SQLite нужно создать новое подключение и выбрать, в качества типа базы данных, SQLite.
Подготовка подключения в DBeaver
Затем надо найти файл базы данных.
Подключение файла базы данных
После этого можно выполнять SQL-запросы к базе данных. Тут нет ничего особенного, отличающегося от работы с обычными реляционными БД.
Выполнение запросов к базе данных
Интеграция с pandas
Думаете, на этом мы завершим разговор о поддержке SQLite в Python? Нет, нам ещё есть о чём поговорить. А именно, так как SQLite — это стандартный Python-модуль, эта СУБД легко интегрируется с дата-фреймами pandas.
Для сохранения датафрейма в БД можно просто воспользоваться его методом to_sql() :
Вот и всё! Нам даже не нужно заранее создавать таблицу. Типы данных и характеристики полей будут настроены автоматически, на основании характеристик датафрейма. Конечно, вы, если надо, можете настроить всё самостоятельно.
Теперь, предположим, нам нужно получить объединение таблиц USER и SKILL и записать полученные данные в датафрейм pandas. Это тоже очень просто:
Чтение данных из БД в датафрейм pandas
Замечательно! А теперь давайте запишем то, что у нас получилось, в новую таблицу с именем USER_SKILL :
С этой таблицей, конечно, можно работать и пользуясь SQL-клиентом.
Применение SQL-клиента для работы с базой данных
Итоги
В Python, безусловно, есть много приятных неожиданностей, которые, если специально их не искать, можно и не заметить. Специально подобные возможности никто не прятал, но из-за того, что в Python встроено очень много всего, на некоторые из таких возможностей можно просто не обратить внимания, или, откуда-то о них узнав, просто о них забыть.
Очень важно то, что SQLite отлично стыкуется с pandas. Данные из БД очень легко считывать, помещая в датафреймы. Не менее проста и операция по сохранению содержимого датафреймов в базу данных. Это ещё сильнее упрощает использование SQLite.
Предлагаю всем, кто дочитал до этого места, заняться собственными исследованиями в поиске интересных возможностей Python!
Код, который я демонстрировал в этой статье, можно найти здесь.
Пользуетесь ли вы SQLite в своих Python-проектах?