example python mysql mysql-python mysql-connector-python

example - python mysql.connector DictCursor?



python mysql select (4)

Al usar Python 3.6.2 y MySQLdb versión 1.3.10, conseguí que esto funcionara con:

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()

Estoy usando PyCharm, y simplemente busco en los módulos MySQLdb connections.py y cursors.py.

En Python mysqldb podría declarar un cursor como un cursor de diccionario como este:

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

Esto me permitiría hacer referencia a las columnas en el bucle del cursor con un nombre así:

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

¿Es posible crear un cursor de diccionario usando este conector MySQL? http://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html

Su ejemplo solo devuelve una tupla.

Me imagino que los creadores de MySQL eventualmente harían esto por nosotros?


De acuerdo con este artículo, está disponible al pasar ''dictionary = True'' al constructor del cursor: dev.mysql.com/doc/connector-python/en/…

así que intenté:

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

y obtuvo: TypeError: cursor () obtuvo un argumento de palabra clave inesperado ''diccionario''

y lo intenté

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

y obtuvo: TypeError: cursor () obtuvo un argumento de palabra clave inesperado ''named_tuple''

e intenté esto también: cursor = MySQLCursorDict(cnx)

pero fue en vano. Claramente estoy en la versión incorrecta aquí y sospecho que solo tenemos que ser pacientes, ya que el documento en http://downloads.mysql.com/docs/connector-python-relnotes-en.a4.pdf sugiere que estas nuevas funciones son En fase alfa en el punto de escritura.


Este ejemplo funciona:

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'']

Tenga en cuenta que en este ejemplo, ''Name'' es específico del nombre de la columna de la base de datos a la que se hace referencia.

Además, si desea utilizar procedimientos almacenados, haga esto en su lugar:

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)))

donde stored_procedure_name es el nombre del procedimiento almacenado que se debe usar y args es la lista de argumentos para ese procedimiento almacenado (deje este campo vacío como [] si no hay argumentos para pasar).

Este es un ejemplo de la documentación de MySQL que se encuentra aquí: dev.mysql.com/doc/connector-python/en/…


Una posible solución consiste en subclasificar la clase MySQLCursor esta manera:

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)

Ahora el método _row_to_python() devuelve un dictionary lugar de una tuple .

Encontré esto en el foro mysql, y creo que fue publicado por los mismos desarrolladores de mysql. Espero que lo agreguen al paquete del conector mysql algún día.

He probado esto y funciona.

ACTUALIZACIÓN: Como se menciona a continuación por Karl MW .. esta subclase ya no es necesaria en v2 de mysql.connector. El mysql.connector se ha actualizado y ahora puede usar la siguiente opción para habilitar un cursor de diccionario.

cursor = db.cursor(dictionary=True)