1、将sqlalchemy查询结果转为dict

class UserModel(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True, index=True)
    nickname = Column(String(32), unique=True, index=True)
    token = Column(String(32))
    status = Column(Boolean, default=True, comment='是否显示: 0=否, 1=是')
    sex = Column(Integer, default=0, comment='性别: 0=男, 1=女')

#单条数据和多条都可以
def to_dict(result):
    if type(result).__name__ == 'list':
        return [{key: getattr(row, key) for key in row.__table__.columns.keys()} for row in result]
    else:
        return {key: getattr(result, key) for key in result.__table__.columns.keys()}

@router.get("/user/{id}")
async def getuser(id: int):
    users = db.query(UserModel).filter(UserModel.id==id).first()
    return {"data":to_dict(users)}

2、手动将sqlalchemy查询结果转为BaseModel

class UserModel(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True, index=True)
    nickname = Column(String(32), unique=True, index=True)
    token = Column(String(32))
    status = Column(Boolean, default=True, comment='是否显示: 0=否, 1=是')
    sex = Column(Integer, default=0, comment='性别: 0=男, 1=女')

class UserOut(BaseModel):
    wx_account_id: int
    nickname: str
    status: bool

    class Config:
        from_attributes = True  # 允许从 ORM 模型(网上大多例子是orm_mode=True,最新版本使用from_attributes)

@router.get("/user/{id}")
async def getuser(id: int):
    users = db.query(UserModel).filter(UserModel.id==id).first()
    return {"data":UserOut.model_validate(users)} #新版请使用model_validate,from_orm已废弃

    #转换多条数据
    #{"data":[UserOut.model_validate(user) for user in users]}

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐