【问题标题】:fastapi fastapi-users with Database adapter for SQLModel users table is not created未创建具有 SQLModel 用户表的数据库适配器的 fastapi fastapi-users
【发布时间】: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使用SQLModelUserDatabaseSQLModelBaseUserDB,这里是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 exampleapp/db.py文件中定义的示例User继承? (然后继承自SQLAlchemyBaseUserTableUUID
  • 请检查我的回答和提供的链接

标签: sqlalchemy python-asyncio fastapi sqlmodel


【解决方案1】:

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

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

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

    重要的是SQLModelBaseUserDB首先继承,因为否则User.id胜过SQLModelBaseUserDB.id并且sqlmodel找不到primary_key

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

【讨论】:

  • 在导入 app.database.User 时出现异常 type object 'User' has no attribute '__config__'。在这里假设class User(SQLAlchemyBaseUserTableUUID, Base) 是否正确?谢谢。
【解决方案2】:

当我发布这个问题时,这是我从 fastapi-users 的一位维护者那里得到的答案,这让我当时切换到 sqlAlchemy,实际上我不知道他们是否正式发布了 sqlModel DB 适配器

我的猜测是您没有更改 UserDB 模型,因此它继承自 SQLModelBaseUserDB 模型。为了让SQLModel 检测您所有的模型并创建它们,这是必要的。

您可以在fastapi-users-db-sqlmodel 测试中了解它应该是什么样子:https://github.com/fastapi-users/fastapi-users-db-sqlmodel/blob/3a46b80399f129aa07a834a1b40bf49d08c37be1/tests/conftest.py#L25-L27

请记住,虽然我们没有正式发布这个数据库适配器;因为它们是 SQLModel 关于 UUID (tiangolo/sqlmodel#25) 的一些问题。所以你可能会遇到问题。

这是问题的 GitHub 链接:https://github.com/fastapi-users/fastapi-users/discussions/861

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-28
    • 2022-12-08
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2023-01-29
    相关资源
    最近更新 更多