Python mysql.connector DictCursor?

В Python mysqldb я мог бы объявить курсор в качестве словарного курсора следующим образом:

cursor = db.cursor(MySQLdb.cursors.DictCursor) 

Это позволит мне ссылаться на столбцы в цикле cursor по имени:

for row in cursor:   # Using the cursor as iterator 
    city = row["city"]
    state = row["state"]

Можно ли создать словарь-словарь с помощью этого соединителя MySQL? http://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html

В их примере возвращается только кортеж.

Я полагаю, что создатели MySQL в конечном итоге сделают это для нас?

Ответы

Ответ 1

Возможное решение включает подклассификацию класса MySQLCursor следующим образом:

class MySQLCursorDict(mysql.connector.cursor.MySQLCursor):
    def _row_to_python(self, rowdata, desc=None):
        row = super(MySQLCursorDict, self)._row_to_python(rowdata, desc)
        if row:
            return dict(zip(self.column_names, row))
        return None

db = mysql.connector.connect(user='root', database='test')

cursor = db.cursor(cursor_class=MySQLCursorDict)

Теперь метод _row_to_python() возвращает dictionary вместо tuple.

Я нашел это на форуме mysql, и я считаю, что он был опубликован самими разработчиками mysql. Надеюсь, они однажды добавят его в пакет соединителя mysql.

Я тестировал это, и он работает.

UPDATE: Как уже упоминалось ниже, Karl M.W... этот подкласс больше не нужен в v2 mysql.connector. Обновлен mysql.connector, и теперь вы можете использовать следующий параметр, чтобы включить словарь.

cursor = db.cursor(dictionary=True)

Ответ 2

В соответствии с этой статьей он доступен, перейдя в "dictionary = True" к конструктору курсора: http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html

поэтому я попробовал:

cnx = mysql.connector.connect(database='bananas')
cursor = cnx.cursor(dictionary=True)

и получил: TypeError: cursor() получил неожиданный ключевой аргумент "словарь"

и я попробовал:

cnx = mysql.connector.connect(database='bananas')
cursor = cnx.cursor(named_tuple=True)

и получил: TypeError: cursor() получил неожиданный аргумент ключевого слова 'named_tuple'

и я тоже попробовал: cursor = MySQLCursorDict(cnx)

но безрезультатно. Очевидно, что я нахожусь в неправильной версии здесь, и я подозреваю, что нам просто нужно быть терпеливым, поскольку документ в http://downloads.mysql.com/docs/connector-python-relnotes-en.a4.pdf предполагает, что эти новые функции в альфа-фазе в точке письма.

Ответ 3

В этом примере работает:

cnx = mysql.connector.connect(database='world')
cursor = cnx.cursor(dictionary=True)
cursor.execute("SELECT * FROM country WHERE Continent = 'Europe'")

print("Countries in Europe:")
for row in cursor:
    print("* {Name}".format(Name=row['Name']

Имейте в виду, что в этом примере 'Name' относится к имени столбца базы данных, на которую ссылаются.

Кроме того, если вы хотите использовать хранимые процедуры, сделайте это вместо этого:

cursor.callproc(stored_procedure_name, args)
result = []
for recordset in cursor.stored_results():
    for row in recordset:
        result.append(dict(zip(recordset.column_names,row)))

где stored_procedure_name - имя используемой хранимой процедуры, а args - список аргументов для этой хранимой процедуры (оставьте это поле пустым, как [], если никакие аргументы не пройдут).

Это пример из документации MySQL, найденной здесь: http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html

Ответ 4

Используя Python 3.6.2 и MySQLdb версии 1.3.10, я получил это для работы с:

import MySQLdb
import MySQLdb.cursors

...

conn = MySQLdb.connect(host='...', 
                       <connection info>, 
                       cursorclass=MySQLdb.cursors.DictCursor)

try:
    with conn.cursor() as cursor:
        query = '<SQL>'
        data = cursor.fetchall()
        for record in data:
            ... record['<field name>'] ...

finally:
    conn.close()

Я использую PyCharm и просто врывался в модули MySQLdb connections.py и cursors.py.