我正在尝试使用fastapi 用户包快速将注册和身份验证系统添加到我的使用 PostgreSQL 数据库的 FastAPI 项目中。我正在使用asyncio
能够创建异步函数。
一开始,我只使用了 sqlAlchemy,我在这里尝试了他们的示例。我将这些代码行添加到我的 app/app.py 以在服务器启动时创建数据库。一切都像魅力一样。表用户是在我的数据库上创建的。
@app.on_event("startup")
async def on_startup():
await create_db_and_tables()
由于我使用的是 SQLModel,因此我将FastAPI Users - SQLModel 的数据库适配器添加到我的虚拟 en 包中。我添加了这些行以便fastapi_users/db/__init__.py
能够使用 SQL 模型数据库。
try:
from fastapi_users_db_sqlmodel import ( # noqa: F401
SQLModelBaseOAuthAccount,
SQLModelBaseUserDB,
SQLModelUserDatabase,
)
except ImportError: # pragma: no cover
pass
我还修改app/users.py
了 , 以SQLModelUserDatabase
代替 sqlAchemy 使用。
async def get_user_manager(user_db: SQLModelUserDatabase = Depends(get_user_db)):
yield UserManager(user_db)
和app/dp.py
使用SQLModelUserDatabase
, SQLModelBaseUserDB
, 这是完整的代码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)
运行代码后,根本不会创建表。我想知道可能是什么问题。我无法理解。任何想法?