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

Унарный оператор + может использоваться для преобразования значения в число в JavaScript. Подчеркивание, по-видимому, проверяет, что свойство .length является числом, иначе оно не будет равно самому преобразованному в номер.

13
задан Ben 15 July 2012 в 03:21
поделиться

3 ответа

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

Так, не точно ответ Вы просили, но возможно просвещали, тем не менее.

11
ответ дан kquinn 15 July 2012 в 14:21
поделиться

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

16
ответ дан Richard Levasseur 15 July 2012 в 14:21
поделиться

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.

1
ответ дан Christian Witts 15 July 2012 в 14:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: