快速 API - MySQL - SQLAlchemy:在 Pydantic 模型中获取

我对这个框架相当陌生,但我正在为一家小公司开发时间表应用程序(API)。


我遇到的问题是,当我从 mysql 选择时间值时,我在 pydantic 模块中收到以下错误:


pydantic.error_wrappers.ValidationError: 2 validation errors for TimeSheetRange 

response -> 0 -> total   

invalid type; expected time, string, bytes, int or float (type=type_error) 

response -> 1 -> total   

invalid type; expected time, string, bytes, int or float (type=type_error)

我已经尝试了很多解决方法来从 mysql 获取字符串时间,to_char()但也失败了,但我更想知道这里的问题是什么,因为我想使用数据类型时间...


schemas.py


from typing import List, Optional

from datetime import date, time, datetime


from pydantic import BaseModel

from . import models


...



class TimeSheetRange(BaseModel):

    user_id: int

    start: date

    total: time


    class Config:

        orm_mode = True

crud.py


def get_timesheet_by_date_range_and_user(db: Session, user_id=int, date_start=datetime, date_end=datetime):

    return db.query(models.TimeSheet.user_id, \

                    func.date(models.TimeSheet.start).label('start'), \

                    func.sec_to_time(func.sum(func.timediff(models.TimeSheet.end,models.TimeSheet.start))).label('total') ) \

            .filter(models.TimeSheet.user_id == user_id) \

            .filter(func.date(models.TimeSheet.start) >= date_start) \

            .filter(func.date(models.TimeSheet.end) <= date_end) \

            .group_by(func.date(models.TimeSheet.start)) \

            .all()

main.py


@app.get("/timesheets/range/", response_model=List[schemas.TimeSheetRange])

    def read_timesheets(user_id: int, date_start:date = datetime.now().date(), date_end:date = datetime.now().date(), db: Session = Depends(get_db)):

        timesheets = crud.get_timesheet_by_date_range_and_user(db, user_id=user_id, date_start=date_start, date_end=date_end)

        return timesheets

以及使用结果构建的 SQL 查询:


SELECT 

    timesheet.user_id AS timesheet_user_id, 

    date(timesheet.start) AS start,

    sec_to_time(sum(timediff(timesheet.end, timesheet.start))) AS total  

FROM 



数据类型有问题time还是我错过了一些非常愚蠢的东西?


慕标5832272
浏览 219回答 1
1回答

白板的微信

我认为这里的问题是,您使用的 Pydantic 模型需要一个time对象类型,而它应该需要一个timedelta类型,因为您的 sql 语句似乎表明您正在计算列的时间差total。所以你的 Pydantic schemas.py 文件应该是:from typing import List, Optionalfrom datetime import date, datetime, timedeltafrom pydantic import BaseModelfrom . import models...class TimeSheetRange(BaseModel):&nbsp; &nbsp; user_id: int&nbsp; &nbsp; start: date&nbsp; &nbsp; total: timedelta&nbsp; &nbsp; class Config:&nbsp; &nbsp; &nbsp; &nbsp; orm_mode = True
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python