【发布时间】:2023-01-10 06:51:16
【问题描述】:
我试图使用 fastapi users 包快速将注册和身份验证系统添加到我使用 PostgreSQL 数据库的 FastAPI 项目。我正在使用 asyncio 来创建异步函数。
一开始,我只使用了 sqlAlchemy,我试过他们的例子here。我将这些代码行添加到我的 app/app.py 以在服务器启动时创建数据库。一切都很顺利。表 users 是在我的数据库中创建的。
@app.on_event("startup")
async def on_startup():
await create_db_and_tables()
因为我使用的是 SQLModel,所以我将 FastAPI Users - Database adapter for SQLModel 添加到我的虚拟包中。我将这些行添加到 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 而不是 sqlAlchemy 之一。
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)
运行代码后,根本不会创建表。我想知道可能是什么问题。我无法理解。任何的想法?
【问题讨论】:
-
我有同样的问题。
UserDB是否从full example的app/db.py文件中定义的示例User继承? (然后继承自SQLAlchemyBaseUserTableUUID) -
请检查我的回答和提供的链接
标签: sqlalchemy python-asyncio fastapi sqlmodel