2017-05-05 15 views
1

私はREST APIを実装しようとしており、その一部はjsonにデータをフォーマットしています。私はmysqlデータベースからデータを取得することができますが、私が受け取るオブジェクトは私が期待するものではありません。ここに私のコードですPythonが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 __name__ == '__main__': 
    app.run(debug=True) 

結果:あなたはタプルを取得しているようにそれはそうあなたの出力から

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

答えて

6

あなたは= [X [0] cursor.descriptionにおけるxに対する] `の後の文を実行し、この row_headersような行ヘッダを抽出するために、カーソルの記述を使用することができます。次に、sqlの結果をzipして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

となります。これはより洗練されたアプローチです! @マニ –

0

:私はこのようなJSON形式を返すように達成するにはどうすればよい

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

バック?この場合、マップするだけで済みます。

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) 
関連する問題