Как я могу ссылаться на столбцы по их именам в Python, вызывающем SQLite? - PullRequest
13 голосов
/ 23 февраля 2009

У меня есть код, который я использовал для запроса 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])

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

Ответы [ 7 ]

21 голосов
/ 18 ноября 2013

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

import sqlite3

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

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

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

16 голосов
/ 23 февраля 2009

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

11 голосов
/ 18 августа 2011

Это можно сделать, добавив после строки «connect» одну строку:

conn.row_factory = sqlite3.Row

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

11 голосов
/ 23 февраля 2009

Я не уверен, что это лучший подход, но вот что я обычно делаю, чтобы получить набор записей, используя модуль, совместимый с 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 голосов
/ 26 июля 2012

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

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

import MySQLdb.cursors

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

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

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

1 голос
/ 23 февраля 2009

API SQLite поддерживает 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.

0 голосов
/ 11 ноября 2018

Используйте описание курсора, вот так:

rows = c.fetchall()
for row in rows:
    for col_i, col in enumerate(row):   
        print("Attribute: {0:30} Value: {1}".format(c.description[col_i][0],col))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...