Python >> Tutoriel Python >  >> Python Tag >> MySQL

Python convertissant le résultat de la requête mysql en json

Vous pouvez utiliser la description du curseur pour extraire les en-têtes de ligne :row_headers=[x[0] for x in cursor.description] après l'instruction d'exécution. Ensuite, vous pouvez le compresser avec le résultat de sql pour produire des données json. Votre code ressemblera donc à :

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)

Dans la déclaration de retour, vous pouvez utiliser jsonify au lieu de json.dumps comme suggéré par RickLan dans les commentaires.


D'après votre sortie, il semble que vous récupérez un tuple? Dans ce cas, vous devriez pouvoir simplement le mapper.

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)

Il existe peut-être un moyen plus simple de procéder :renvoyer un dictionnaire et le convertir en JSON.

Passez juste dictionary=True au constructeur du curseur comme mentionné dans les documents 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)}")

Qui imprimera -

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

(En supposant que ces Bobs sont dans le tableau.)

Notez que les types sont préservés de cette façon, une bonne chose, MAIS devront être transformés, analysés ou sérialisés en une chaîne ; par exemple, s'il y a une date, la requête SQL peut retourner un datetime objet, qui devra être analysé ou sérialisé en fonction de votre prochaine étape. Une excellente façon de sérialiser se trouve dans cette réponse.