Продолжим работать с базами данных со встроенной Python-библиотекой — sqlite3, которая предоставляет интерфейс SQLite. На практическом примере расскажем о создании таблиц, построим отношение один-ко-многим и покажем результаты в SQL-клиенте — DBeaver.
Интерфейс SQLite в Python
В прошлой статье мы разобрались с интерфейсом sqlite3, а именно:
- как устанавливать соединение с базой данных,
- как совершать транзакции, используя контекстный менеджер with,
- как инициализировать объект Cursor, полезный для получения данных,
- как писать безопасные запросы, используя
?или:value.
Теперь можем приступить к созданию таблиц.
Создаем таблицу user
Для выполнения запросов используется метод execute. Пусть будет таблица User с тремя атрибутами: id, имя, возраст. Код в Python для создания таблицы будет выглядеть так:
import sqlite3
con = sqlite3.connect("test.db")
cur = con.cursor()
with con:
cur.execute("""
CREATE TABLE user (
id INT NOT NULL PRIMARY KEY,
name TEXT,
age INTEGER
);
""")
Типов данных в SQLite всего 5: NULL, INT, REAL, TEXT, BLOB. Последний тип данных — это Binary Large OBjects, т.е. бинарные объекты (документы, рисунки, аудио).
Добавляем данные
Добавить можно как одну запись, так и список записей. Во втором случае используется executemany. Выполним два запроса в Python:
query = 'INSERT INTO USER (id, name, age) values(?, ?, ?)'
data = [
(2, 'Vova', 25),
(3, 'Anna', 21),
(4, 'Kolya', 19)
]
with con:
cur.executemany(query, data)
data = (1, "Sasha", 32)
with con:
cur.execute("INSERT INTO user (id, name, age) values(?, ?, ?)", data)
Выводим данные пользователей
Используя метод fetchall объекта Cursor, можно получить все записи, например:
cur.execute("SELECT * FROM user WHERE age <= 22").fetchall()
# [(3, 'Anna', 21), (4, 'Kolya', 19)]
В то время как метод fetchone выдаст только первую:
cur.execute("SELECT * FROM USER WHERE age <= 22").fetchone()
# (3, 'Anna', 21)
Отношение один-ко-многим
Воспроизведем отношение один-ко-многим. Допустим, каждый пользователь знает несколько иностранных языков. Для этого нам понадобятся еще две таблицы: таблица с языками и таблица, которая связывает id пользователя и id языка.
Таблица языков с Python-кодом будет выглядеть так:
with con:
cur.execute("""
CREATE TABLE language (
id INT NOT NULL PRIMARY KEY,
name TEXT
);
""")
Таблица, которая связывает id пользователя и id языка, должна иметь внешние ключи этих id, которые вместе образуют первичный ключ. В итоге, это выглядит так:
with con:
cur.execute("""
CREATE TABLE user_language (
user_id INT,
language_id INT,
PRIMARY KEY(user_id, language_id),
FOREIGN KEY(user_id) REFERENCES user(id),
FOREIGN KEY(language_id) REFERENCES language(id)
);
""")
Добавляем данные языков
Добавим несколько языков в таблицу Language. Запрос в Python:
data = [
(1, "english"),
(2, "spanish"),
(3, "french")
]
with con:
cur.executemany("INSERT INTO language VALUES(?, ?)", data)
Теперь обозначим пользователей, которые знают иностранные языки:
data = [
(1, 2), # Саша знает испанский
(2, 1), # Вова знает английский
(2, 2), # Вова еще знает испанский
(3, 3), # Анна знает французский
]
with con:
cur.executemany("INSERT INTO user_language VALUES(?, ?)", data)
Выводим данные пользователей, знающих иностранные языки
Выведем пользователей и языки, которые они знают. Нам нужно только записать условие совпадения идентификаторов. В Python запрос выглядит следующим образом:
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')]
После работы с базой данных следует закрыть соединение:
con.close()
SQL-клиент DBeaver для просмотра результатов
Можно получить доступ к базам данных с помощью SQL-клиента, например, свободного и открытого DBeaver. Запустив DBeaver, необходимо установить соединение с базой данных во вкладке Базы данных (Database), как это показано на рисунке ниже. После этого указать тип БД и путь к ней.

В DBeaver также можно писать запросы. Кроме этого, мы можем посмотреть на ER-диаграмму созданных таблиц в соответствующей вкладке. На рисунке ниже это проиллюстрировано.

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



