Twisted MySQL AdBAPI возврат словарь - PullRequest
7 голосов
/ 07 декабря 2011

Есть ли способ вернуть результат словаря из запроса adbapi в MySQL?

[name: 'Bob', phone_number: '9123 4567']

По умолчанию возвращает кортеж.

['Bob', '9123 4567']

Для простых Python и MySQL мы можем использовать MySQLdb.cursors.DictCursor .Но как его использовать с витой адбапи


UPD: Я решил, но думаю, что должен быть лучший способ.Мое решение: просто переопределить * _runInteraction * метод adbapi.ConnectionPool class.

class MyAdbapiConnectionPool(adbapi.ConnectionPool):
def _runInteraction(self, interaction, *args, **kw):
    conn = self.connectionFactory(self)
    trans = self.transactionFactory(self, conn)
    try:
        result = interaction(trans, *args, **kw)
        if(result and isinstance(result[0], (list, tuple))):
            colnames = [c[0] for c in trans._cursor.description]
            result = [dict(zip(colnames, item)) for item in result]         
        trans.close()
        conn.commit()
        return result
    except:
        excType, excValue, excTraceback = sys.exc_info()
        try:
            conn.rollback()
        except:
            log.err(None, 'Rollback failed')
        raise excType, excValue, excTraceback

1 Ответ

9 голосов
/ 04 января 2012

Вы можете указать MySQLdb использовать DictCursor, передав его в качестве значения аргумента cursorclass в функцию connect. ConnectionPool позволяет передавать произвольные аргументы методу подключения:

import MySQLdb
pool = ConnectionPool("MySQLdb", ..., cursorclass=MySQLdb.cursors.DictCursor)
...

Когда вы запустите запрос, вы получите dict вместо кортежа, например, runQuery("SELECT 1") даст результат ({'1': 1L},)

...