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.