it-swarm.com.ru

Python, преобразовывающий результат запроса mysql в json

Я пытаюсь реализовать REST API, и частично это форматирование данных в json. Я могу получить данные из базы данных MySQL, однако объект, который я получаю, не то, что я ожидаю. вот мой код

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)

Результат:

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

Как мне добиться, чтобы вернуть формат JSON, как это:

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

Вы можете использовать описание курсора для извлечения заголовков строк следующим образом Row_headers = [x [0] для x в cursor.description] `после оператора execute. Затем вы можете сжать его с результатом sql для получения данных JSON. поэтому ваш код будет

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

Из вашего вывода кажется, что вы получаете Tuple обратно? В этом случае вы должны иметь возможность просто отобразить это.

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

В зависимости от версии mysql, ваш db может вернуть json.

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

также удобно:

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

в вашем случае:

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