常见问题
约 586 字大约 2 分钟
Redis 缓存
由于缓存机制的特性,非接口操作对数据的更改可能无法实时反映到结果中。以下是两种常见场景:
返回数据异常
适用场景: 非首次部署,或反复部署并初始化测试数据
若此前已调用过 fba 接口,相关数据可能已悄无声息地写入 Redis 缓存。随后,即便重新部署了 fba,整个部署过程并不会自动清除 Redis 中的缓存数据。因此,调用重新部署后的 fba 接口时,若发现返回数据异常,而数据库检查又未发现问题,很可能是缓存未更新导致。此时,手动清理 Redis 中的 fba 缓存即可解决问题,系统将自动恢复正常
手动修改数据库数据
适用场景: 通过数据库直接修改数据
假设我们直接在数据库中修改了某些数据,但调用接口后发现返回结果未发生变化。返回数据可能来源于 Redis 缓存,而通过数据库直接修改的操作不会触发缓存的自动更新。因此,返回数据看似未受影响。解决方法是手动清理 Redis 中的相关缓存,之后数据将正确反映修改结果
can't call await_only() here.
{
"code": 500,
"msg": "(sqlalchemy.exc.MissingGreenlet) greenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place?\n[SQL: SELECT sys_dict_data.id AS sys_dict_data_id, sys_dict_data.label AS sys_dict_data_label, sys_dict_data.value AS sys_dict_data_value, sys_dict_data.sort AS sys_dict_data_sort, sys_dict_data.status AS sys_dict_data_status, sys_dict_data.remark AS sys_dict_data_remark, sys_dict_data.type_id AS sys_dict_data_type_id, sys_dict_data.created_time AS sys_dict_data_created_time, sys_dict_data.updated_time AS sys_dict_data_updated_time \nFROM sys_dict_data \nWHERE %s = sys_dict_data.type_id]\n[parameters: [{'%(2071788311008 param)s': 1}]]\n(Background on this error at: https://sqlalche.me/e/20/xd2s)",
"data": null,
"trace_id": "89afd9b0f2b8442590661701e2b6b495"
}
在 SQLAlchemy 2.0 中异步中,关系(relationship)表默认使用 懒加载,所以,如果你未在 ORM 语句中添加关联字段的 加载策略,那么关联字段可能被定义为错误(如上图所示),此时如果调用 pydantic / fastapi 序列化,那么将触发字段错误,因为字段本身就是个错误
可用的解决方案有多种,请阅读 SQLA 官方文档,fba 默认使用 noload()
对此进行处理,例如:
stmt = (
select(self.model)
.options(
selectinload(self.model.dept).options(noload(Dept.parent), noload(Dept.children), noload(Dept.users)),
noload(self.model.socials),
selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.rules)),
)
.order_by(desc(self.model.join_time))
)