web-dev-qa-db-fra.com

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

J'essaie d'implémenter les API REST. Le formatage des données en json fait partie. Je suis capable de récupérer des données d'une base de données mysql, cependant l'objet que je reçois n'est pas ce que j'attendais. voici mon code

from flask import Flask
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()
   return str(rv)

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

Résultat:

((1L, u'my_username', u'my_password'),)

Comment puis-je obtenir un format JSON comme ceci:

{
 "id":1, 
 "username":"my_username", 
 "password":"my_password"
}
6
edmamerto

Vous pouvez utiliser la description du curseur pour extraire les en-têtes de ligne comme ceci Row_headers = [x [0] pour x dans cursor.description] `après une instruction d'exécution. Ensuite, vous pouvez le compresser avec le résultat de SQL pour produire des données JSON. votre code sera 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 __== '__main__':
   app.run(debug=True)
17
Mani

D'après votre production, il semble que vous récupériez un tuple? Dans ce cas, vous devriez pouvoir 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 __== '__main__':
   app.run(debug=True)
1
Mike Tung

Selon la version de mysql, votre base de données pourrait renvoyer json.

select json_object('key',`column`,'key2',`column2`) from table;

aussi pratique:

select json_merge(a.json, b.json) from 
(select json_object(...)) a, 
(select json_object(...)) b

dans votre exemple:

id = 1
cur.execute("select json_object('id',`column1`,'username',`column2`,'password',`column3`) from `users` where `id` = '{}'".format(id));
data = cur.fetchall()
0
mbunch