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.