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)