Преобразование результатов запроса sqlite в словарь
Быстрый ответ
Взаимодействие между SQLite и Python может значительно упростить некоторые типовые задачи. Чтобы превратить результаты запроса в SQLite в словарь, установите атрибут row_factory
вашего объекта подключения как sqlite3.Row
. Это преобразует каждую строку результата запроса в объект Row
, который функционирует аналогично словарю и позволяет обращаться к значениям столбцов по их названиям, при этом регистр учитываться не будет.
import sqlite3
# Создаем подключение к базе данных и настраиваем row factory
conn = sqlite3.connect('database.db')
conn.row_factory = sqlite3.Row # Настраиваем row factory
# Подготавливаем SQL запрос и на его основе формируем словарь...
row = conn.cursor().execute("SELECT * FROM table").fetchone()
# Получаем словарь – это то, что нам нужно!
row_dict = dict(row)
# Выводим результат на экран
print(row_dict)
Создание простого словаря с помощью dict_factory
Иногда объекты Row
кажутся избыточными. Если вам нужен простой словарь, можно настроить row_factory
так, чтобы он использовал функцию dict_factory
, которая превращает названия столбцов и их значения в обычные словари.
def dict_factory(cursor, row):
d = {} # Создаем пустой словарь
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx] # Заполняем его значениями
return d
# Обучаем наше соединение использовать нашу dict_factory
conn.row_factory = dict_factory
# Выполняем запрос, извлекаем данные и выводим результаты
dicts = conn.cursor().execute("SELECT * FROM table").fetchall()
for record in dicts:
print(record) # Получаем словари, заполненные данными!
Выбор данных из столбцов по индексу или названию
Выбор данных из столбцов можно осуществлять двумя способами: указывая индекс, аналогично непосредственному указанию на предмет, или по названию, аналогично формальному запросу.
# Выбираем данные по индексу – как простой жест указания!
value = row[0]
# Выбираем данные по названию столбца – достаточно произнести его имя!
value = row['column_name']
sqlite3.Row
предоставляет нам свободу в выборе подхода, позволяя обращаться к значениям столбцов независимо от регистра.
Базы данных в памяти: работа без дискового хранения
База данных в оперативной памяти — это отличное решение для тестировщиков и разработчиков на начальных этапах. При помощи специального параметра :memory:
можно быстро выполнять SQL-запросы без необходимости обращения к диску.
conn = sqlite3.connect(":memory:") # Помните, все это хранится в памяти!
conn.row_factory = sqlite3.Row
# Создаем таблицу и вставляем данные, все просто!
conn.cursor().execute('CREATE TABLE fantasy (id integer primary key, beast text)')
conn.cursor().execute("INSERT INTO fantasy (beast) VALUES ('dragon')")
# Извлекаем данные в форме словаря и наслаждаемся результатом!
row_dict = dict(conn.cursor().execute("SELECT * FROM fantasy").fetchone())
print(row_dict)
Ручное создание словаря из результатов запроса
Если вас интересует процесс создания словаря из результатов SQL-запроса, Python предоставит необходимые инструменты. Например, функция zip()
поможет провести соответствие между именами столбцов и их значениями.
cursor = conn.cursor()
cursor.execute("SELECT * FROM table")
columns = [column[0] for column in cursor.description]
values = cursor.fetchone()
row_dict = dict(zip(columns, values)) # Именно так функционирует ZIP!
# Выводим полученный словарь на экран
print(row_dict)
Визуализация
Представьте, что вы заказываете сэндвич (🥩):
Запрос SQLite: "SELECT * FROM toppings"
Результат:
| lettuce | bacon | cheese |
| ------- | ----- | ------ |
| 0 | 1 | 1 |
... и он превращается в заказ на сэндвич:
order = {'lettuce': 0, 'bacon': 1, 'cheese': 1}
Каждый столбец представляет собой ингредиент, значение в строке обозначает, включен ли он (1
) или нет (0
).
🥩 = {
"lettuce": "Нет 🥬",
"bacon": "Да 🥓",
"cheese": "Да 🧀"
}
Результат: Ваш заказ понятен, сэндвич готов к подаче!
Сравнение sqlite3.Row
и обычных словарей
У sqlite3.Row
и обычных словарей есть свои достоинства и недостатки. Выбор следует делать, исходя из конкретных целей и задач:
sqlite3.Row
: – Достоинства: быстродействие, небольшой объем, доступ к данным по индексу и названию. – Недостатки: ограниченный функционал, привязанность к SQLite.Обычные словари: – Достоинства: гибкость, универсальность, возможность сериализации и совместимость с различными форматами данных. – Недостатки: создание в ручную может требовать дополнительных ресурсов, включая время и память.
Автоматическая итерация за счет использования row_factory
Правильно настроив row_factory
, можно избежать необходимости вручную итерировать данные при создании словарей. sqlite3.Row
или пользовательская dict_factory
обеспечат удобное представление данных в форме словаря.
Полезные материалы
- Python sqlite3 Documentation – Row Objects — Источник знаний о взаимодействии с базами данных в Python!
- Data Management With Python, SQLite, and SQLAlchemy – Real Python — Детальное руководство по обработке больших объемов информации.
- Querying — peewee 3.17.0 documentation — Полезные советы по использованию словарей с ORM Peewee.
- Object Relational Tutorial (1.x API) — SQLAlchemy 1.4 Documentation — Знакомство с ORM на уровне SQL-запросов!
- Introduction to SQLite in Python | Python Central — Вводный курс по SQLite в Python.
- PyFormat: Using % and .format() for great good! — Совершенствуйте ваши навыки форматирования в Python.