Python将mysql查询结果转换为json

edm*_*rto 11 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 __name__ == '__main__':
   app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

结果:

((1L, u'my_username', u'my_password'),)
Run Code Online (Sandbox Code Playgroud)

我如何实现返回这样的json格式:

{
 "id":1, 
 "username":"my_username", 
 "password":"my_password"
}
Run Code Online (Sandbox Code Playgroud)

Man*_*ani 27

您可以使用游标描述在执行语句之后提取行标题,如row_headers = [x [0] for x in cursor.description]`.然后你可以用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)
Run Code Online (Sandbox Code Playgroud)


Mik*_*ung 10

从您的输出中,您似乎得到了一个元组?在这种情况下,您应该能够对其进行映射。

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)
Run Code Online (Sandbox Code Playgroud)


Non*_*714 8

也许有一种更简单的方法来做到这一点:返回一个字典并将其转换为 JSON。

只需传递dictionary=TrueMySQL 文档中提到的游标构造函数。

import json
import mysql.connector

db = mysql.connector.connect(host='127.0.0.1',
                             user='admin',
                             passwd='password',
                             db='database',
                             port=3306)

# This line is that you need
cursor = db.cursor(dictionary=True)

name = "Bob"
cursor.execute("SELECT fname, lname FROM table WHERE fname=%s;", (name))

result = cursor.fetchall()

print(f"json: {json.dumps(result)}")
Run Code Online (Sandbox Code Playgroud)

哪个将打印 -

json: [{'fname': "Bob", 'lname': "Dole"}, {'fname': "Bob", 'lname': "Marley"}]
Run Code Online (Sandbox Code Playgroud)

(假设那些 Bobs 在表中。)

请注意,以这种方式保留类型,这是一件好事,但需要将其转换、解析或序列化为字符串;例如,如果有日期,SQL 查询可能会返回一个datetime对象,该对象将需要根据您的下一步进行解析或序列化。一个很好的序列化方法是在这个答案中