Saltar al contenido

Python convierte el resultado de la consulta mysql a json

Solución:

Puede usar la descripción del cursor para extraer encabezados de fila:
row_headers=[x[0] for x in cursor.description] después de la sentencia de ejecución. Luego, puede comprimirlo con el resultado de sql para producir datos json. Entonces tu código será algo como:

from flask import Flask
from flask.ext.mysqldb import MySQL
import json
app = Flask(__name__)
app.config['MYSQL_HOST'] = '127.0.0.1'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'hello_db'
mysql = MySQL(app)

@app.route('/hello')
def index():
   cur = mysql.connection.cursor()
   cur.execute('''SELECT * FROM Users WHERE id=1''')
   row_headers=[x[0] for x in cur.description] #this will extract row headers
   rv = cur.fetchall()
   json_data=[]
   for result in rv:
        json_data.append(dict(zip(row_headers,result)))
   return json.dumps(json_data)

if __name__ == '__main__':
   app.run(debug=True)

En la declaración de devolución puede usar jsonify en lugar de json.dumps como sugirió RickLan en los comentarios.

¿De su salida parece que está recuperando una tupla? En cuyo caso, debería poder mapearlo.

from flask import Flask, jsonify
from flask.ext.mysqldb import MySQL

app = Flask(__name__)
app.config['MYSQL_HOST'] = '127.0.0.1'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'hello_db'
mysql = MySQL(app)

@app.route('/hello')
def index():
   cur = mysql.connection.cursor()
   cur.execute('''SELECT * FROM Users WHERE id=1''')
   rv = cur.fetchall()
   payload = []
   content = {}
   for result in rv:
       content = {'id': result[0], 'username': result[1], 'password': result[2]}
       payload.append(content)
       content = {}
   return jsonify(payload)

if __name__ == '__main__':
   app.run(debug=True)

Quizás haya una forma más sencilla de hacer esto: devolver un diccionario y convertirlo a JSON.

Solo pasa dictionary=True al constructor del cursor como se menciona en los documentos de MySQL.

import json
import mysql.connector

db = mysql.connector.connect(host="127.0.0.1",
                             user="admin",
                             passwd='password',
                             db='database',
                             port=3306)

# This line is that you need
cursor = db.cursor(dictionary=True)

name = "Bob"
cursor.execute("SELECT fname, lname FROM table WHERE fname=%s;", (name))

result = cursor.fetchall()

print(f"json: {json.dumps(result)}")

Que imprimirá –

json: [{'fname': "Bob", 'lname': "Dole"}, {'fname': "Bob", 'lname': "Marley"}]

(Suponiendo que esos Bobs estén en la tabla).

Tenga en cuenta que los tipos se conservan de esta manera, algo bueno, PERO deberán transformarse, analizarse o serializarse en una cadena; por ejemplo, si hay una fecha, la consulta SQL puede devolver un datetime objeto, que deberá analizarse o serializarse según el siguiente paso. Una excelente manera de serializar es en esta respuesta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *