Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 11, 2012 14:16:34

Vi
Зарегистрирован: 2012-11-29
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Обратится к полям полученного набора по имени

Всем доброго. когда я получаю курсор из запроса, я по факту получаю кортеж полей в каждой записи.
Если мне не удобно обращаться по номеру к элементу кортежа (допустим я заранее не знаю по какому номеру будет значени, т.е. мне не известна структура набора, который получен по *-ке) могу ли я как-то обращаться к полю по его имени?

Офлайн

#2 Дек. 11, 2012 16:50:47

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Обратится к полям полученного набора по имени

Да. В общем случае cursor.description:

>>> con = somedb.connect(...)
>>> cur = con.cursor()
>>> cur.execute("SELECT * FROM test")
>>> cur.description[0]
Column(name='field', type_code=23, display_size=None, internal_size=4, precision=None, scale=None, null_ok=None)
Т.е. имя столбца:
>>> cur.description[0][0]
'field'
В документации Flask есть пример как перегнать в словарик
def query_db(query, args=(), one=False):
    cur = g.db.execute(query, args)
    rv = [dict((cur.description[idx][0], value)
               for idx, value in enumerate(row)) for row in cur.fetchall()]
    return (rv[0] if rv else None) if one else rv

А в случае с sqlite есть оптимизированная sqlite3.Row для sqlite3.Connection.row_factory

Офлайн

#3 Дек. 11, 2012 17:20:04

igor
Зарегистрирован: 2012-05-01
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Обратится к полям полученного набора по имени

Для pyodbc смотрите раздел Selecting Some Data/Select Basics на http://code.google.com/p/pyodbc/wiki/GettingStarted

Офлайн

#4 Дек. 12, 2012 19:57:18

Vi
Зарегистрирован: 2012-11-29
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Обратится к полям полученного набора по имени

Спасибо. Сделал функцию получения значения вот так:

    def Field(me,FieldID):
        if type(FieldID) is str:
            for i,d in enumerate(me.Cursor.description):
                if d[0]==FieldID: return me.Record[i]
            return ''
        else:
            if FieldID<len(me.Record):  return me.Record[FieldID]
            else: return ''

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version