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 __name__ == '__main__':
app.run(debug=True)
結果:
((1L, u'my_username', u'my_password'),)
次のようなjson形式を返すにはどうすればよいですか?
{
"id":1,
"username":"my_username",
"password":"my_password"
}
カーソルの説明を使用して、executeステートメントの後にこのrow_headers = [x.0 for cursor.description] `のような行ヘッダーを抽出できます。次に、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)
出力から、タプルが戻ってきているように見えますか?その場合、マップするだけでいいはずです。
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)
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()