sqlalchemy - 简单地格式化 FastApi 端点返回的 SQLAlchemy 模型

标签 sqlalchemy fastapi camelcasing post-processing

假设我有一个简单的 SQLAlchemy 类和一个简单的 Flask o FastAPI 实现,如下所示:

from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel
Base = declarative_base()
    
class A(Base):
    __tablename__ = 'as'
    my_id = Column(String)
    
class AModel(BaseModel):
    myId:str = None

还有一个像这样的简单端点:

@app_router.get('/a')
def get_all_a(session:Session = Depends(get_session)):
    return session.query(A).all()

如何确保此端点的返回列表以驼峰命名法生成,如下所示:

[{'myId': 'id1'},{'myId': 'id2'}, ...]

注意:我的应用程序相当复杂,因为我还实现了分页,并且一些后处理需要的不仅仅是snake_case到camelCase的转换,所以最简单的解决方案是最好的。

我尝试过重写 dict() 方法和类似的东西,但没有成功,根本无法理解 FastAPI 如何处理结果以获得 JSON。

最佳答案

2023 年可能更新:

此解决方案与 pydantic < v2.0 兼容,并且不一定反射(reflect)这个令人惊叹的库的 future 版本

require a little bit more that just snake_case to camelCase conversion

好吧,如果你不使用response_model,你就没有很多选择。

解决方案是返回您的字典,并将其从snake_case转换为camelCase。您有递归执行此操作的函数。

为什么它是最好的解决方案?

使用正则表达式速度非常快,比任何像 pydantic 这样将 dict 转换为 obj 的库都快

如果您绝对不想这样做,那么您唯一的解决方案是使用 pydantic 模型、属性或数据类,并将数据库查询输出转换为具有驼峰命名法变量名称(脏)的模型类型之一。

由于您使用的是 fastapi,因此您应该充分利用它的全部功能。

我建议这样做:

from typing import List

from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel, Field
from pydantic import parse_obj_as
Base = declarative_base()

class A(Base):
    __tablename__ = 'as'
    my_id = Column(String)

class AModel(BaseModel):
    myId: str = Field(alias="my_id", default=None)

@app_router.get('/a', response_model=List[AModel])
def get_all_a(session:Session = Depends(get_session)):
    return parse_obj_as(List[AModel], session.query(A).all())

请记住,在 CamelCase 中使用类变量并不是一个好的做法。

最好的答案是不返回 Camel ,而是返回蛇,并让您的客户在需要时进行转换工作。

关于sqlalchemy - 简单地格式化 FastApi 端点返回的 SQLAlchemy 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70036507/

相关文章:

json - RestTemplate 在 Spring REST 中不返回带有 Snake Case 的值

c# - Camel Case Web API Json 设置似乎不起作用

python - 关于FastAPI中的最大递归错误

python-3.x - 如何使用 fastapi 日志记录捕获 X-Forwarded-For?

python - 将 pandas 列名称从蛇形命名法转换为驼峰式命名法

Python、SQLAlchemy 和 Postgresql : understanding inheritance

python - 当我使用fastapi和pydantic构建POST API时,出现TypeError : Object of type is not JSON serializable

postgresql - SQL炼金术ORM : LEFT JOIN LATERAL() ON TRUE

sqlalchemy - 如何在SQLAlchemy中使用 "compound order by"

python - 覆盖用于测试的 SQLAlchemy 列