【问题标题】:string error in jsonify(results) - Flask, SQLAlchemyjsonify(结果)中的字符串错误 - Flask,SQLAlchemy
【发布时间】:2018-06-27 12:49:34
【问题描述】:

我正在使用一个烧瓶应用程序,该应用程序查询我的 sqlite 数据库并提取有关每年每个州的疾病病例数的信息。下面的路由提取了正确的数据,但由于某种原因,不会打印出请求中的字符串,例如“Cases_2010”、“Rate_2010 等”。这是字符串本身的问题还是连接的问题?它确实打印了“State”字符串,之后就没有了。

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine, func, desc
from flask import Flask, jsonify
import json
import numpy as np
import os


engine = create_engine("sqlite:///westnile_1.sqlite")

Base = automap_base()
Base.prepare(engine, reflect=True)

Disease_Data = Base.classes.disease_data 

session = Session(engine)

app = Flask(__name__)

@app.route("/")
def home():
    return(
        f"Welcome to the West Nile Virus Case Report API <br>"
        f"Available routes: <br>"
        f"/api/v1.0/Cases_per_year_2010_2017 <br>"
        f"/api/v1.0/case_totals <br>"
        f"/api/v1.0/json_combined <br>")


@app.route("/api/v1.0/Cases_per_year_2010_2017")
def cases_2010_2017():

    results_10 = session.query("State: " + Disease_Data.State, "Cases_2010: " + Disease_Data.Cases_2010, "Rate_2010: " + Disease_Data.Rate_2010,
        "Cases_2011: " + Disease_Data.Cases_2011, "Rate_2011: " + Disease_Data.Rate_2011,
        "Cases_2012: " + Disease_Data.Cases_2012, "Rate_2012: " + Disease_Data.Rate_2012,
        "Cases_2013: " + Disease_Data.Cases_2013, "Rate_2013: " + Disease_Data.Rate_2013,
        "Cases_2014: " + Disease_Data.Cases_2014, "Rate_2014: " + Disease_Data.Rate_2014,
        "Cases_2015: " + Disease_Data.Cases_2015, "Rate_2015: " + Disease_Data.Rate_2015,
        "Cases_2016: " + Disease_Data.Cases_2016, "Rate_2016: " + Disease_Data.Rate_2016,
        "Cases_2017: " + Disease_Data.Cases_2017, "Rate_2017: " + Disease_Data.Rate_2017).all()     

    json2010 = json.dumps(results_10)

    return jsonify(results_10)

results_10

sqlite db

updated output of return jsonify (json2010)

【问题讨论】:

  • 您的表是否与 State, Cases_2010 的列名相同?然后,您可以轻松地将实际上是元组的结果对象转换为 dict/json。
  • 是的,表中的列名相同。如何转换成 dict/json?

标签: python string flask flask-sqlalchemy


【解决方案1】:

由于我没有关于 ORM 的任何信息,因此我假设 Orm 的列数与表中的列数完全相同。

results_10 = session.query(Disease_Data).all() # This will return the list of Disease_Data objects
json_list= []
for result in results_10:
    temp_dict = result.__dict__
    temp_dict.pop('_sa_instance_state',None)
    json_list.append(temp_dict) 
    # OR
    # temp_dict = dict(result)
    # temp_dict.pop('_sa_instance_state',None) # removing unwanted key
    # json_list.append(dict(result)) #Either of two should work

json2010 = json.dumps(json_list)

return jsonify(results_10)

我无法在本地测试它,但应该给出一个想法。

如果您想保留数据的格式:

column_list = Disease_Data.__table__.columns.keys()
results_10 = session.query(Disease_Data).all() # This will return the list of Disease_Data objects
    json_list= []

    for result in results_10:
        temp_dict={}
        for col in column_list:
            temp_dict[col] = getattr(result,col) 
        json_list.append(temp_dict)
    json2010 = json.dumps(json_list)

return jsonify(results_10)

【讨论】:

  • 感谢您的帮助。当我尝试上述方法时,它给了我一个回溯错误:TypeError: Object of type 'InstanceState' is not JSON serializable.
  • 更新了代码。通过迭代 Table 列并分配值,可以有一些优雅的方法。或者创建一个执行此操作的函数,然后在忽略键“_sa_instance_state”的同时附加到列表中。希望对你有帮助
  • 会忽略以正确格式保存数据吗?更深入一点:这些数据需要与每个状态保持相关,因为一旦这是一个 json 文件,我需要扩展 geojson 文件的属性键以包含每个状态的此信息。然后使用 geojson 制作我的 choropleth(最终产品)。
  • '_sa_instance_state' 键的值不包含您需要序列化的任何有用数据。
  • 我可以在烧瓶应用程序中执行此操作吗?或者我应该采用原始元组并在应用程序之外使用它(在应用程序之外添加键)。 choropleth 是用 javascript 构建的。
猜你喜欢
  • 2011-10-29
  • 2018-12-16
  • 2017-11-05
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多