Estaba tratando de usar el paquete de usuarios de fastapi para agregar rápidamente un sistema de registro y autenticación a mi proyecto FastAPI que usa la base de datos PostgreSQL. Estoy usando asyncio para poder crear funciones asíncronas.
Al principio, solo usé sqlAlchemy y probé su ejemplo aquí . Y agregué esa línea de códigos a mi app/app.py para crear la base de datos al inicio del servidor. y todo funcionó a las mil maravillas. los usuarios de la tabla se crearon en mi base de datos.
@app.on_event("startup") async def on_startup(): await create_db_and_tables() Como estoy usando SQLModel, agregué FastAPI Users - Adaptador de base de datos para SQLModel a mis paquetes virtuales. Y agregué esas líneas a fastapi_users/db/__init__.py para poder usar la base de datos del modelo SQL.
try: from fastapi_users_db_sqlmodel import ( # noqa: F401 SQLModelBaseOAuthAccount, SQLModelBaseUserDB, SQLModelUserDatabase, ) except ImportError: # pragma: no cover pass También modifiqué app/users.py para usar SQLModelUserDatabase en lugar de sqlAchemy one.
async def get_user_manager(user_db: SQLModelUserDatabase = Depends(get_user_db)): yield UserManager(user_db) y app/dp.py para usar SQLModelUserDatabase , SQLModelBaseUserDB , aquí está el código completo de app/db.py
import os from typing import AsyncGenerator from fastapi import Depends from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker from fastapi_users.db import SQLModelUserDatabase, SQLModelBaseUserDB from sqlmodel import SQLModel from app.models import UserDB DATABASE_URL = os.environ.get("DATABASE_URL") engine = create_async_engine(DATABASE_URL) async_session_maker = sessionmaker( engine, class_=AsyncSession, expire_on_commit=False) async def create_db_and_tables(): async with engine.begin() as conn: await conn.run_sync(SQLModel.metadata.create_all) async def get_async_session() -> AsyncSession: async_session = sessionmaker( engine, class_=AsyncSession, expire_on_commit=False ) async with async_session() as session: yield session async def get_user_db(session: AsyncSession = Depends(get_async_session)): yield SQLModelUserDatabase(UserDB, session, SQLModelBaseUserDB)Una vez que ejecuto el código, la tabla no se crea en absoluto. Me pregunto cuál podría ser el problema. No lo pude entender. ¿Alguna idea?
Tuve el mismo problema, pero logré que funcionara haciendo un par de cambios.
Los cambios que necesitaba hacer (el código se basa en el ejemplo completo en la documentación):
UserDB herede de SQLModelBaseUserDB, User y agregue table=True para que sqlmodel cree la tabla: class UserDB(SQLModelBaseUserDB, User, table=True): pass Es importante que SQLModelBaseUserDB se herede primero, porque de lo contrario, User.id triunfa sobre SQLModelBaseUserDB.id y primary_key no puede encontrar la columna principal_clave.
SQLModelUserDatabaseAsync en get_user_db , así (según tengo entendido, no necesita pasar SQLModelBaseUserDB en SQLModelUserDatabase. El tercer argumento es para el modelo de cuenta oauth): async def get_user_db(session: AsyncSession = Depends(get_async_session)): yield SQLModelUserDatabaseAsync(UserDB, session)