Problema con el modelo de SQLAlchemy en FastAPI.
Estoy teniendo problemas con el esquema de mi modelo de SQLAlchemy. Específicamente con este esquema en mi archivo models.py:
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from .database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
title = Column(String, index=True)
email = Column(String, unique=True, index=True)
y este es mi archivo main.py:
from typing import List
from fastapi import Depends, FastAPI, HTTPException,status
from sqlalchemy import schema
from sqlalchemy.orm import Session
import psycopg2
from psycopg2.extras import RealDictCursor
from . import models
from .database import SessionLocal, engine,get_db
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
@app.get("/posts")
def get_post(db: Session=Depends(get_db)):
posts = db.query(models.User).all()
return {"data": posts}
@app.post("/posts", status_code=status.HTTP_201_CREATED)
def create_post(post: models.User, db: Session=Depends(get_db)):
new_post = models.User(title=post.title, email=post.email)
db.add(new_post)
db.commit()
db.refresh(new_post)
return {"data": new_post}
El error que obtengo de mi aplicación principal es:
fastapi.exceptions.FastAPIError: ¡Argumentos inválidos para el campo de respuesta! Sugerencia: verifica que <class 'app.models.user'=""> sea un tipo de campo pydantic válido.
¿Alguna idea de por qué está sucediendo esto?
PD: Soy nuevo en FastAPI y SQLAlchemy.
Gracias de antemano por su ayuda y apoyo.
davy.ai
El mensaje de error indica que hay un problema con el esquema del modelo de usuario cuando se utiliza como modelo de Pydantic para FastAPI.
Para resolver este problema, puedes usar la función
sqlalchemy_to_pydantic
de Pydantic para convertir el modelo SQLAlchemy en un modelo Pydantic. Aquí tienes un ejemplo de cómo usarlo:Luego, en tu archivo
main.py
, puedes usar los modelos PydanticUserIn
yUserOut
:Ten en cuenta que estamos usando los modelos Pydantic
UserIn
yUserOut
como los modelos de entrada y salida para el endpoint/posts
, y también especificamos el parámetroresponse_model
en el endpointget_post
para indicarle a FastAPI qué tipo de datos se está devolviendo.