将 sqlalchemy 响应转换为 pydantic 对象

M.K*_*K.S 3 python sqlalchemy pydantic fastapi

如何在FastAPI中将字符串转换为模型类型?如果我有学生模型并且想要将字符串学生转换为类型模型。如何转换呢?

engine = create_engine(SQLALCHAMY_DATABASE_URL,pool_pre_ping=True,pool_recycle=3600)
meta = MetaData()
con = engine.connect()
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)
Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


def convert_model(student,db:Session = Depends(database.get_db)):
   Q=student.all()



convert_model(student,db)
Run Code Online (Sandbox Code Playgroud)

它给出了错误str object has no attribute all()

Bas*_*n B 5

在您的示例中,学生是一个定义参数,而不是您的数据库模型。

你应该看看fastapi 官方用户指南,它以简单的方式详细解释了如何构建一个简单而干净的 api。

您有专门的部分介绍如何加载数据库对象。

您有一个关于 honw 的专门部分来处理来自数据库模型的列表响应。

db_config.py


from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import sessionmaker, declarative_base

from app.settings import get_settings

engine = create_engine(SQLALCHAMY_DATABASE_URL,pool_pre_ping=True,pool_recycle=3600)
meta = MetaData()
con = engine.connect()
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)
Base = declarative_base()

def get_session():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

Run Code Online (Sandbox Code Playgroud)

my_router.py

from typing import List

from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel, Field
from pydantic import parse_obj_as

from db_config import get_session
from db_config import Base

class StudentModel(Base): # <- your database model
    something = Column(String)

class StudentSchema(BaseModel): # <- your pydantic model
    something: str = Field(..., example="something")

@app_router.get('/students', response_model=List[StudentSchema])
def get_all_StudentModel(session:Session = Depends(get_session)):
    return parse_obj_as(List[StudentSchema], session.query(StudentModel).all())

Run Code Online (Sandbox Code Playgroud)