我正在尝试通过 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
我已经按照这个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”,因为我没有能力找出“正确的做法”