2017-05-05 51 views
1

我試圖實現REST API,並且它的一部分是將數據格式化爲json。我能夠從mysql數據庫中檢索數據,但是我收到的對象並不是我所期望的。這裏是我的代碼Python將mysql查詢結果轉換爲json

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 __name__ == '__main__': 
    app.run(debug=True) 

結果:

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

如何實現返回一個JSON格式是這樣的:

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

回答

6

可以使用光標描述來提取行標題這樣 row_headers = [X [0]用於cursor.description中X]`之後執行語句。然後你可以用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 __name__ == '__main__': 
    app.run(debug=True) 
+0

這是一個更優雅的方法謝謝! @Mani –

0

從你的輸出好像你得到一個元組背部?在這種情況下,你應該能夠映射它。

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)