В прошлый раз мы разбирали на практическом примере, как работать с SQLite в Python. Помимо прочего, встроенная СУБД также просто интегрируется с библиотекой Pandas, которая применяется для работы с данными в Data Science. Сегодня мы расскажем о том, как добавить данные из DataFrame в базу данных и, наоборот, как из записей БД получить DataFrame.
Читаем таблицы User и Language
В прошлой статье мы создали несколько таблиц с отношением один-ко-многим: пользователь (User) может знать несколько языков (Language). Рисунок ниже показывает ER-диаграмму в DBeaver.

Чтобы вывести тех пользователей, которые знают иностранный язык, нужно написать следующий Python-код:
import sqlite3
con = sqlite3.connect("test.db")
cur = con.cursor()
cur.execute("""
SELECT user.name, language.name
FROM user, language, user_language
WHERE (user.id = user_language.user_id AND
language.id = user_language.language_id)
""").fetchall()
И на выходе получится следующий результат:
[('Sasha', 'spanish'),
('Vova', 'english'),
('Vova', 'spanish'),
('Anna', 'french')]
А теперь рассмотрим, как можно настроить взаимодействие между SQLite и Pandas.
Считываем записи из базы данных в DataFrame
Мы можем получить записи из базы данных и записать их в DataFrame — объект для представления табличных данных в Pandas. Это очень полезно, поскольку в Data Science данные иногда приходится хранить в базах данных, а работать с ними в Python.
Для получения записей из базы данных используется метод read_sql, который принимает в качестве аргументов запрос и соединение. В Python это реализуется следующим образом:
import pandas as pd
df = pd.read_sql("SELECT * FROM user", con)
Полученный DataFrame изображен на рисунке ниже.

Можно также реализовать запрос, который выводит данные из двух таблиц User и Language:
sql = """
SELECT user.name, language.name
FROM user, language, user_language
WHERE (user.id = user_language.user_id AND
language.id = user_language.language_id)
"""
df = pd.read_sql(sql, con)
В результате DataFrame с этим запросом выглядит вот так:

Считываем данные из DataFrame в базу данных
Теперь, наоборот, экспортируем записи DataFrame в базу данных. Создадим DataFrame с новыми пользователями:
df = pd.DataFrame({
"id": [5, 6],
"name": ["Sveta", "Galya"],
"age": [41, 55]
})

Полученный DataFrame можно добавить к таблице User. Для этого используется метод to_sql. Аргумент index равен False, поскольку по умолчанию Pandas считает свою индексацию как отдельный атрибут, а аргумент if_exists="append" используется, чтобы добавить новые записи к старым.
df.to_sql("user", con=con, if_exists="append", index=False)
Написав запрос на вывод всех пользователей, получится следующая картина:
pd.read_sql('''
SELECT *
FROM user
''', con)

Создаем новую таблицу в Pandas
Помимо добавления данных из Pandas в существующую таблицу, можно создать новую таблицу. Но Pandas не дает возможности использовать отношения (один-к-одному, один-ко-многим и т.д.), поэтому это будет отдельная таблица. Для примера создадим DataFrame с занимаемыми должностями:
df_job = pd.DataFrame({
"user_id": [1, 2, 3, 4],
"job": ["Data Science", "Python programmer",
"ML engineer", "Java programmer"]
})

Применив метод to_sql, мы получим новую таблицу без какого либо отношения. Ниже показаны Python-код и рисунок с ER-диаграммой.
df_job.to_sql("Job", con)

Тем не менее, запросы к новой и старым таблицам все также можно совершать. Вот так, например, выглядит запрос в Python для вывода имени, знания языков и должности:
sql = """
SELECT user.name, language.name, user_job.job
FROM user, user_language, language, user_job
WHERE (user.id = user_language.user_id AND
language.id = user_language.language_id AND
user.id = user_job.user_id)
"""
pd.read_sql(sql, con)

Несмотря на то, что здесь рассматривался пример интеграции Pandas именно c SQLite, можно также интегрировать Pandas с любой другой СУБД.
Использованный в статье код доступен в репозитории на Github. А приобрести практические навыки работы с данными в Pandas и SQL на практических примерах Data Science проектов, вы сможете на наших курсах по Python в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.
Источники



