Подтвердить что ты не робот

Как я могу ссылаться на столбцы по их именам в python, вызывающем SQLite?

У меня есть код, который я использовал для запроса MySQL, и я надеюсь использовать его с SQLite. Моя реальная надежда состоит в том, что это не будет включать внесение слишком большого количества изменений в код. К сожалению, следующий код не работает с SQLite:

cursor.execute(query)

rows = cursor.fetchall()

data = []
for row in rows
  data.append(row["column_name"])

Это приводит к следующей ошибке:

 TypeError: tuple indices must be integers

Если я изменяю ссылку на использование номера столбца, она отлично работает:

  data.append(row[1])

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

4b9b3361

Ответ 1

Я не уверен, что это лучший подход, но вот что я обычно делаю, чтобы получить набор записей, используя модуль, совместимый с DB-API 2:

cursor.execute("""SELECT foo, bar, baz, quux FROM table WHERE id = %s;""", 
                  (interesting_record_id,))

for foo, bar, baz, quux in cursor.fetchall():
    frobnicate(foo + bar, baz * quux)

Метод форматирования запроса является одним из стандартов DB-API, но, по-видимому, предпочтительным является метод Psycopg2; другие адаптеры DB-API могут предложить другое соглашение, которое будет хорошо.

Написание таких запросов, где неявная распаковка набора используется для работы с набором результатов, как правило, была более эффективной для меня, чем пытаться беспокоиться о совпадении имен переменных Python с именами столбцов SQL (которые я обычно использую только для удаления префиксов, а затем только тогда, когда я работаю с подмножеством имен столбцов, так что префиксы больше не помогают прояснить ситуацию) и намного лучше, чем помнить идентификаторы числовых столбцов.

Этот стиль также помогает избежать SELECT * FROM table..., что является просто катастрофой обслуживания для чего угодно, кроме простейших таблиц и запросов.

Итак, не совсем тот ответ, о котором вы просили, но, возможно, просвещающий тем не менее.

Ответ 2

Чтобы получить доступ к столбцам по имени, используйте атрибут row_factory экземпляра Connection. Он позволяет вам установить функцию, которая принимает аргументы cursor и row, и возвращает все, что вам нужно. Там несколько встроенных в pysqlite, а именно sqlite3.Row, что делает то, что вы просили.

Ответ 3

В течение пяти лет с тех пор, как вопрос был задан, а затем ответил, возникло очень простое решение. Любой новый код может просто обернуть объект соединения строкой factory. Пример кода:

import sqlite3

conn = sqlite3.connect('./someFile')
conn.row_factory = sqlite3.Row        // Here the magic!

cursor = conn.execute("SELECT name, age FROM someTable")
for row in cursor:
    print(row['name'])

Вот некоторые тонкие документы. Наслаждайтесь!

Ответ 5

SQLite API поддерживает cursor.description, так что вы можете легко сделать это как

headers = {}
for record in cursor.fetchall():
    if not headers:
        headers = dict((desc[0], idx) for idx,desc in cursor.description))
    data.append(record[headers['column_name']])

Немного длинный, но выполняет свою работу. Я заметил, что они даже имеют его в файле factory.py в файле dict_factory.

Ответ 6

Ответ kushal на этот форум отлично работает:

Используйте DictCursor:

import MySQLdb.cursors

.
.
.
cursor = db.cursor (MySQLdb.cursors.DictCursor)
cursor.execute (query)
rows = cursor.fetchall ()

for row in rows:
print row['employee_id'] 

Обратите внимание, что имя столбца зависит от регистра.