首页 > 解决方案 > 有没有办法如何使用带有 sqlite 后端的 flask_sqlalchemy 保存 json

问题描述

我正在尝试以JSON 的形式保存数据(作为 POST 请求的结果返回)

def get_data(...):
    ...

    try:
        _r = requests.post(
            _url_list,
            headers=_headers
        )

        return _r.json()
    except Exception as ee:
        print('Could not get data: {}'.format(ee))
        return None

放入SQLITE 数据库中的表作为后端。

def add_to_flight_data(_data):
    if _data:
        try:
            new_record = FlightData(data=_data)
            db.session.add(new_record)
            db.session.commit()
            print('Data instertedto DB!')
            return "Success"
        except Exception as e:
            print('Data NOT instertedto DB! {}'.format(e))
            pass

这是我的简单烧瓶代码

import os
import time
import auth
import json
import requests
import datetime
from flask import Flask
from flask_marshmallow import Marshmallow
from flask_sqlalchemy import SQLAlchemy
# from safrs.safrs_types import JSONType

project_dir = os.path.dirname(os.path.abspath(__file__))
database_file = "sqlite:///{}".format(os.path.join(project_dir, "2w.sqlite"))

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = database_file
db = SQLAlchemy(app)
ma = Marshmallow(app)


class FlightData(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    created = db.Column(db.DateTime, server_default=db.func.now())
    json_data = db.Column(db.JSONType, default={})

    def __init__(self, data):
        self.data = data

似乎可能没有将 JSON 保存在 sqlite 中的选项 json_data = db.Column(db.JSONType, default={})

请告知 谢谢。

标签: jsonsqliteflasksqlalchemy

解决方案


我相信您应该使用db.JSON,而不是db.JSONType因为 sqlalchemy 中没有这样的列类型。

无论如何,SQLite 没有 JSON 数据类型,因此 sqlalchemy 无法将类型列映射db.JSON到任何内容。根据文档,仅支持 Postgres 和一些 MySQL。在带有JSON1 扩展的 SQLite 中支持 JSON ,但 sqlalchemy 将无法使用它。

那么最好的选择是将列声明为db.Text并用于json.dumps()在写入时对数据进行 jsonify。或者修改您的get_data()函数以检查 JSON 响应(检查Content-type标头或尝试调用_r.json()和捕获异常),然后返回_r.content已经是 JSON 字符串。

用于json.loads()从数据库中读回数据。


推荐阅读