Python将mysql查询结果转换为json

时间:2017-05-05 04:15:52

标签: python mysql json

我正在尝试实现REST API,其中一部分是将数据格式化为json。我能够从mysql数据库中检索数据,但是我收到的对象并不是我所期望的。这是我的代码

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

结果:

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

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

c.HTMLExporter.anchor_link_text = '' # disable pilcrow, requires nbconvert >= 5.2

7 个答案:

答案 0 :(得分:20)

您可以使用游标说明来提取这样的行标题 执行语句后的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)

答案 1 :(得分:4)

也许有一种更简单的方法来执行此操作:返回字典并将其转换为JSON。

只需将dictionary=True传递给MySQL's documents中提到的游标构造函数即可。

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)}")

哪个会打印-

json: [{'fname': "Bob", 'lname': "Dole"}, {'fname': "Bob", 'lname': "Marley"}]

(假设那些鲍勃在桌子上。)

请注意,类型是通过这种方式保存的,这是一件好事,但是需要将BUT转换,解析或序列化为字符串;例如,如果有日期,则SQL查询可能返回一个datetime对象,该对象需要根据下一步进行解析或序列化。进行序列化的一种好方法是在this answer中。

答案 2 :(得分:3)

从你的输出看起来好像你得到了一个元组?在这种情况下,您应该只能映射它。

<!-- star main navbar -->
<div class="container innernav">
  <nav class="navbar navbar-default navbar-fixed-top">
    <div class="container text-center">
      <div class="navbar-header"> <a class="navbar-brand" href="#"><img src="images/logo-inner.jpg"></a> </div>
      <div id="navbar" class="navbar-collapse">
        <ul class="nav navbar-nav">
          <li><a href="#">Home</a></li>
          <li><a href="#">About us</a></li>
          <li><a href="#">our products</a></li>
          <li><a href="#">about tea</a></li>
          <li><a href="#">media</a></li>
          <li><a href="#">contact us</a></li>
          <li><a href="#">locater</a></li>
        </ul>
      </div>
    </div>
  </nav>
</div>

<!-- end main navbar -->
</div>
<section id="banner">
  <div class="container-fluid">
  <!--start banner ares-->
    <div class="row"> 
     <div class="inner-banner">
         <!--**********banner area************-->
      </div>
    </div>
    <!--end banner ares--> 
  </div>
</section>

<section id="main-content"> 
<!--start inner page navi-->
  <div class="container-fluid no-horizontal-padding">
    <div class="row">
      <div class="col-md-12">
        <nav class="navbar navbar-default inside" data-spy="affix" data-offset-top="400">
          <div class="container text-center">
            <div id="navbar" class="navbar-collapse">
              <ul class="nav navbar-nav">
                <li><a href="#">Overview</a></li>
                <li><a href="#">Our Story</a></li>
                <li><a href="#">Our Team</a></li>
                <li><a href="#">Global presence</a></li>
                <li><a href="#">Certification</a></li>
                <li><a href="#"> Our Facilities</a></li>
              </ul>
            </div>
          </div>
        </nav>
      </div>
    </div>
  </div>
  <!--end inner page navi-->
   <div class="container-fluid">
   
    <!--******body content*****-->
   
   </div>
  </section>

答案 3 :(得分:1)

对于使用Django的用户,您可以从django.http导入JsonResponse来完成工作。

示例代码段:

from django.http import JsonResponse
from django.db import connection

def home(request):
    with connection.cursor() as cursor:
        cursor.execute("select * from YOUR_TABLE")
        columns = [col[0] for col in cursor.description]
        return JsonResponse([
            dict(zip(columns, row))
            for row in cursor.fetchall()
        ], safe=False)

注意:已添加safe=False以将词典列表转换为Json。

答案 4 :(得分:1)

这是我通过设置 app.config['MYSQL_CURSORCLASS'] 和使用 jsonify 来解决这个问题的方法

from flask import Flask, jsonify
from flask_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'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor' # line of code you require

mysql = MySQL(app)

@app.route('/hello')
def index():
   cur = mysql.connection.cursor()
   cur.execute("SELECT * FROM Users WHERE id=1")
   rv = cur.fetchall()
   return jsonify(rv) # use jsonify here

if __name__ == '__main__':
   app.run(debug=True)

答案 5 :(得分:0)

content = {} # seems like a double declaration
for result in rv:
       content = {'id': result[0], 'username': result[1], 'password': result[2]}
       payload.append(content)
       content = {} # why do have this line code still works
   return jsonify(payload)

答案 6 :(得分:0)

如果您想将更多$GIT_EXEC_PATH转换为JSON文件,则可以使用下面的简单程序代码来完成。有关more的详细信息,您在github上有三种解决方案。

鉴于很多事情已经得到澄清。简要介绍一下方法:

  • select query results-支持日期时间的编码器-doc
  • class DateTimeEncoder(JSONEncoder)-当前时间以区分是否使用可变数据
  • get_current_date_time-使用光标描述提取行标题,您将获得一个字典对象标题数组:值。
  • query_db-在已创建的write_json(query_path)文件夹中读取SQL并生成JSON
  • output-使用glob在扩展名为.sql的目录中查找所有文件,并调用描述和定义的方法convertion_mysql
write_json