Nano Hash - криптовалюты, майнинг, программирование

Python - mysqlDB, результат sqlite как словарь

Когда мне что-то нравится

sqlite.cursor.execute("SELECT * FROM foo")
result = sqlite.cursor.fetchone()

Я думаю, что нужно запомнить порядок, в котором столбцы могут их извлекать, например

result[0] is id
result[1] is first_name

есть ли способ вернуть словарь? так что я могу вместо этого просто использовать результат ['id'] или аналогичный?

Проблема с пронумерованными столбцами заключается в том, что если вы напишете свой код, а затем вставите столбец, вам, возможно, придется изменить код, например, результат [1] для first_name теперь может быть date_joined, поэтому придется обновить весь код ...



Ответы:


1

У Дэвида Бизли есть хороший пример этого в его Справочном руководстве по Python.
У меня нет книги под рукой, но я думаю, что его пример выглядит примерно так:

def dict_gen(curs):
    ''' From Python Essential Reference by David Beazley
    '''
    import itertools
    field_names = [d[0].lower() for d in curs.description]
    while True:
        rows = curs.fetchmany()
        if not rows: return
        for row in rows:
            yield dict(itertools.izip(field_names, row))

Пример использования:

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()
>>> c.execute('create table test (col1,col2)')
<sqlite3.Cursor object at 0x011A96A0>
>>> c.execute("insert into test values (1,'foo')")
<sqlite3.Cursor object at 0x011A96A0>
>>> c.execute("insert into test values (2,'bar')")
<sqlite3.Cursor object at 0x011A96A0>
# `dict_gen` function code here
>>> [r for r in dict_gen(c.execute('select * from test'))]
[{'col2': u'foo', 'col1': 1}, {'col2': u'bar', 'col1': 2}]
10.11.2010

2

Делая это в mysqlDB, вы просто добавляете следующее к вызову функции подключения

cursorclass = MySQLdb.cursors.DictCursor
21.11.2010

3

Вы можете сделать это очень легко. Для SQLite: my_connection.row_factory = sqlite3.Row

Проверьте это в документации Python: http://docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index

ОБНОВЛЕНИЕ:

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.row_factory = sqlite3.Row
>>> c = conn.cursor()
>>> c.execute('create table test (col1,col2)')
<sqlite3.Cursor object at 0x1004bb298>
>>> c.execute("insert into test values (1,'foo')")
<sqlite3.Cursor object at 0x1004bb298>
>>> c.execute("insert into test values (2,'bar')")
<sqlite3.Cursor object at 0x1004bb298>
>>> for i in c.execute('select * from test'): print i['col1'], i['col2']
... 
1 foo
2 bar
10.11.2010
  • Спасибо @Adam за интерактивный образец. 10.11.2010

  • 4

    экземпляр sqlite3.Row можно преобразовать в dict - очень удобно для вывода результата в виде json

    >>> csr = conn.cursor()
    >>> csr.row_factory = sqlite3.Row
    >>> csr.execute('select col1, col2 from test')
    >>> json.dumps(dict(result=[dict(r) for r in csr.fetchall()]))
    
    06.07.2011
  • это дает мне dictionary update sequence element #0 has length 15; 2 is required 22.12.2012

  • 5
  • Есть ли способ добавить строки, извлеченные DictCursor, в set(), не сталкиваясь с TypeError: unhashable type: 'dict'? 11.06.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..