【问题标题】:Is there a way how to save json with flask_sqlalchemy with sqlite backend有没有办法如何使用带有 sqlite 后端的烧瓶 sqlalchemy 保存 json
【发布时间】:2018-11-26 00:32:41
【问题描述】:

我正在尝试以 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

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

请告知 谢谢。

【问题讨论】:

    标签: json sqlite flask sqlalchemy


    【解决方案1】:

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

    不管怎样,SQLite 没有 JSON 数据类型,所以 sqlalchemy 无法将 db.JSON 类型的列映射到任何东西上。根据documentation,仅支持 Postgres 和一些 MySQL。在 SQLite 中使用 JSON1 extension 支持 JSON,但 sqlalchemy 将无法使用它。

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

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

    【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2021-01-17
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多