1

我正在尝试使用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)

运行代码后,根本不会创建表。我想知道可能是什么问题。我无法理解。任何想法?

4

1 回答 1

0

我遇到了同样的问题,但通过进行一些更改设法使其工作

我需要进行的更改(代码基于文档中的完整示例):

  1. 在models.py中,makeUserDB继承自SQLModelBaseUserDB, User,并table=True为sqlmodel添加创建表:
    class UserDB(SQLModelBaseUserDB, User, table=True):
        pass

从第一个继承很重要SQLModelBaseUserDB,因为否则User.id王牌SQLModelBaseUserDB.id和sqlmodel找不到primary_key

  1. 使用SQLModelUserDatabaseAsyncin get_user_db,像这样(据我了解,不需要在 SQLModelUserDatabase 中传入 SQLModelBaseUserDB。第三个参数用于 oauth 帐户模型):
async def get_user_db(session: AsyncSession = Depends(get_async_session)):
    yield SQLModelUserDatabaseAsync(UserDB, session)
于 2022-03-03T12:48:58.087 回答