db = sqlite.connect("test.sqlite")
res = db.execute("select * from table")
С итерацией я получаю списки, соответствующие строкам.
for row in res:
print row
Я могу получить название столбцов
col_name_list = [tuple[0] for tuple in res.description]
Но есть ли какая-то функция или настройка для получения словарей вместо списка?
{'col1': 'value', 'col2': 'value'}
или я должен делать сам?
python
sql
sqlite
dictionary
dataformat
Мэлоун
источник
источник
Ответы:
Вы можете использовать row_factory , как в примере в документации:
или следуйте совету, который дан сразу после этого примера в документации:
источник
SELECT 1 AS "dog[cat]"
тогда у нихcursor
не будет правильного описания для создания словаря.connection.row_factory = sqlite3.Row
и попробовал,connection.row_factory = dict_factory
как показано, ноcur.fetchall()
все еще дает мне список кортежей - есть идеи, почему это не работает?collections.namedtuple
. Когда я использую,cur.fetchmany()
я получаю такие записи, как<sqlite3.Row object at 0x...>
.Я думал, что отвечу на этот вопрос, хотя ответ частично упоминается как в ответах Адама Шмидега, так и Алекса Мартелли. Для того, чтобы такие же люди, как я, задавали тот же вопрос, легко могли найти ответ.
источник
fetchall()
кажется, что возвращаетsqlite3.Row
объекты. Однако они могут быть преобразованы в словарь , просто используяdict()
:result = [dict(row) for row in c.fetchall()]
.Даже используя класс sqlite3.Row - вы по-прежнему не можете использовать форматирование строк в виде:
Чтобы обойти это, я использую вспомогательную функцию, которая берет строку и преобразует ее в словарь. Я использую это только тогда, когда объект словаря предпочтительнее объекта Row (например, для таких вещей, как форматирование строки, где объект Row также не поддерживает API словаря). Но всегда используйте объект Row.
источник
print "%(id)i - %(name)s: %(value)s" % dict(row)
После подключения к SQLite:
con = sqlite3.connect(.....)
достаточно просто запустить:Вуаля!
источник
С PEP 249 :
Так что да, сделай сам.
источник
Более короткая версия:
источник
Самый быстрый в моих тестах:
против:
Вам решать :)
источник
Как упоминалось в ответе @gandalf, нужно использовать
conn.row_factory = sqlite3.Row
, но результаты не являются непосредственно словарями. Вdict
последнем цикле нужно добавить дополнительное "приведение" к :источник
Подобные решения, как и ранее упомянутые, но наиболее компактные:
источник
db.row_factory = sqlite3.Row
не сработал для меня (поскольку он привел к JSON TypeError)Я думаю, ты был на правильном пути. Давайте сделаем это очень простым и завершим то, что вы пытались сделать:
Обратной стороной является то
.fetchall()
, что если ваша таблица очень большая , это убивает потребление памяти . Но для тривиальных приложений, работающих с несколькими тысячами строк текста и числовых столбцов, этого простого подхода достаточно.Для серьезных вещей вам следует изучить фабрики строк, как это предлагается во многих других ответах.
источник
Или вы можете преобразовать sqlite3.Rows в словарь следующим образом. Это даст словарь со списком для каждой строки.
источник
Общая альтернатива, использующая всего три строки
Но если ваш запрос ничего не вернет, это приведет к ошибке. В таком случае...
или
источник
Результат определенно верный, но лучшего я не знаю.
источник
Словари в Python предоставляют произвольный доступ к своим элементам. Таким образом, любой словарь с «именами», хотя он может быть информативным, с одной стороны (например, каковы имена полей), «отменяет порядок» полей, что может быть нежелательным.
Лучше всего собрать имена в отдельный список, а затем при необходимости самостоятельно объединить их с результатами.
Также помните, что имена во всех подходах - это имена, которые вы указали в запросе, а не имена в базе данных. Исключение составляет
SELECT * FROM
Если ваша единственная забота - получить результаты с помощью словаря, обязательно используйте
conn.row_factory = sqlite3.Row
(уже указано в другом ответе).источник