从数据类“[x(id=1, c=1), x(id=2, c=4), x(...)...]”到Json/dict? |将 SQLAlchemy 结果序列化为 Json / 挣扎于输出格式

问题描述 投票:0回答:1

我正在尝试通过 sqlalchemy 检索 sqlite3 数据库中的所有记录。 我遇到困难的是输出格式,即转换为有效的 json 格式。

有很多教程如何做到这一点,我认为最相关的是这个:Link

遵循这种方法(在尝试了许多其他方法之后,包括 pydantic),我成功地检索了数据;现在我要把它变成正确的格式,这就是我陷入困境的地方。

我觉得我忽略了一些微小的细节;任何指示将不胜感激。

我很确定我可以编写一个解析器来将当前格式转换为 json,但我想以“正确的方式”进行操作,并且目前不知道我哪里出错了..

感谢您的时间和指点。

....
from dataclasses import dataclass

@dataclass
class Request(db.Model):
    id: str = db.Column(db.Integer, primary_key=True)
    request_text: str = db.Column(db.String(400))   
    status: str = db.Column(db.String(400))   
    added_from: str = db.Column(db.String(400))  
    added_date: str = db.Column(db.String(400))      
    update_date: str = db.Column(db.String(400)) 


@socketio.on('getList')
def getList():
    requests = Request.query.all()
    print(requests)

这是当前输出的样子:

[Request(id=1, request_text='Clown - Juggling balls in the air', status='Added', added_from='wish', added_date='11/18/2023, 16:06:10', update_date='11/18/2023, 16:06:10'), Request(id=2, request_text='a', status='Added', added_from='wish', added_date='11/18/2023, 16:06:12', update_date='11/18/2023, 16:06:12'), Request(id=3, request_text='b', status='Added', added_from='wish', added_date='11/18/2023, 16:06:13', update_date='11/18/2023, 16:06:13'), Request(id=4, request_text='c', status='Added', added_from='wish', added_date='11/18/2023, 16:06:14', update_date='11/18/2023, 16:06:14')]

以下是上述结果的成分:

Python: 3.10.12
Flask: 2.2.5
Flask-Migrate: 4.0.5
Flask-SQLAlchemy: 3.3.1
json python-3.x flask serialization flask-sqlalchemy
1个回答
0
投票

我已经按照这个post解决了这个问题,像这样设置类并在底部添加“to_dict”:

@dataclass
class Request(db.Model):
    id: str = db.Column(db.Integer, primary_key=True)
    request_text: str = db.Column(db.String(400))    
    status: str = db.Column(db.String(400))   
    added_from: str = db.Column(db.String(400))  
    added_date: str = db.Column(db.String(400))      
    update_date: str = db.Column(db.String(400)) 
    def to_dict(self):
        return {field.name:getattr(self, field.name) for field in self.__table__.c}

然后像这样查询它并创建我自己的字典列表:

def get_list():
    requests = Request.query.all()
    request_list = {}
    for request in requests:
        request_dict = request.to_dict()
        id = request_dict['id']
        request_list[id] = request_dict

    print(request_list)

也许这种“重新包装”的方法不是最优雅的解决方案,但它对我有用。如果有人有更好的方法,我很乐意了解。我觉得这个很“hacky”,因为我没有能力找出“正确的做法”

© www.soinside.com 2019 - 2024. All rights reserved.