Estoy tratando de crear una FAST Api que está leyendo una tabla ya existente en la base de datos PostgreSQL pero me está dando un error interno del servidor. Apreciaría su dirección sobre lo que podría estar mal con el código
La tabla existente se ve así:
esquema: esquema de prueba
tabla: test_api
| identificación | |
|---|---|
| 1 | prueba@***.com |
| 2 | prueba2@***.com |
engine = sqlalchemy.create_engine("my_database_connection") Base = declarative_base() database = databases.Database("my_database_connection") metadata = sqlalchemy.MetaData() metadata.reflect(bind=engine, schema='testSchema') test_api_tb = metadata.tables['testSchema.test_api'] class testAPI(Base): __tablename__ = test_api_tb id = Column(Integer, primary_key=True) email = Column(String(256)) app = FastAPI() @app.get("/testing_api/") def read_users(): query = test_api_tb.select() return database.execute(query)El error que obtengo de los registros
RecursionError: maximum recursion depth exceeded in comparisonLo mejor que puedes hacer es leer la documentación oficial en fastapi.tiangolo.com , es increíble y explica todo lo básico de forma muy detallada.
Las bases de datos relacionales de SQL se usan muy a menudo con FastAPI y también se mencionan en la documentación aquí . Puede encontrar un tutorial paso a paso sobre cómo usar postgresql con sqlalchemy y FastAPI.
Hay algunas partes para hacer que esto funcione. La primera parte es conectarse a la base de datos:
engine = create_engine(my_database_connection) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base()creamos el motor con la cadena de conexión como lo hizo, luego necesitamos crear una sesión para conectarnos a la base de datos. Al final estamos creando una clase Base que nos ayudará a crear los modelos y esquemas.
Ahora necesitamos crear el modelo usando la clase base tal como lo hizo anteriormente. debemos asegurarnos de que __tablename__ sea el mismo que el nombre de la tabla en la base de datos
class testAPIModel(Base): __tablename__ = "test_api" id = Column(Integer, primary_key=True) email = Column(String(256))Ahora viene la parte principal. Necesitamos asegurarnos de vincular el motor de la base de datos a la clase base usando
Base.metadata.create_all(bind=engine)Ahora crearemos una función que nos ayudará y creará una instancia de sesión de db y cerrará la conexión cuando terminemos con la consulta.
def get_db(): db = SessionLocal() try: yield db finally: db.close()Ahora podemos crear la instancia de la aplicación FastAPI y obtener los datos de la base de datos.
@app.get("/testing_api/") def read_users(db:Session = Depends(get_db)): users = db.query(testAPIModel).all() return users Estamos usando Depends(get_db) para inyectar la sesión de base de datos de la función que escribimos anteriormente.
El código completo:
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, Session from fastapi import Depends, FastAPI from sqlalchemy import Column, Integer, String my_database_connection = "postgresql://user:password@server_ip/db_name" engine = create_engine(my_database_connection) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() class testAPIModel(Base): __tablename__ = "test_api" id = Column(Integer, primary_key=True) email = Column(String(256)) Base.metadata.create_all(bind=engine) app = FastAPI() def get_db(): db = SessionLocal() try: yield db finally: db.close() @app.get("/testing_api/") def read_users(db:Session = Depends(get_db)): users = db.query(testAPIModel).all() return users¡Buena suerte!