繁体   English   中英

FASTAPI 测试数据库不创建数据库

[英]FASTAPI Testing Database not creating db

我正在尝试测试我的 FASTAPI 应用程序。 在我看来,所有设置都是正确的。

测试用户.py

engine = create_engine(
    f"postgresql"
    f"://{settings.database_username}"
    f":{settings.database_password}"
    f"@{settings.database_hostname}"
    f":{settings.database_port}"
    f"/test_{settings.database_name}"
    )
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base.metadata.create_all(bind=engine)

def override_get_db():
    try:
        db = TestingSessionLocal()
        yield db
    finally:
        db.close()

app.dependency_overrides[get_db] = override_get_db

client = TestClient(app)


def test_create_user():
    response = client.post(
        "/users/",
        json={"email": "nikita@gmail.com", "password": "password"}
    )
    new_user = schemas.UserOutput(**response.json())

    assert response.status_code == 201
    assert new_user.email == "nikita@gmail.com"

当我运行pytest时,我收到此错误

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "localhost" (::1), port 5432 failed: FATAL:  database "test_social_media_api" does not exist

为什么代码没有创建数据库?

使用engine = create_engine("postgresql://...")定义与现有 PostgreSql 数据库的连接。 使用Base.metadata.create_all(bind=engine)您可以根据您的模型在现有数据库中创建表。

所以你写的代码不会创建数据库,它希望你给它一个已经存在的数据库。

这与 PostgreSQL 本身有关。 PostgreSQL作为服务器运行,PostgreSQL服务器可以运行多个数据库。 并且必须显式创建每个数据库。 仅仅告诉 SQLAlchemy 连接字符串是不够的。

可以通过连接到 PostgreSQL 服务器从 Python 本身创建一个新数据库(参见https://www.tutorialspoint.com/python_data_access/python_postgresql_create_database.htm ),或者您可以在运行脚本之前手动创建它。 例如,通过运行CREATE DATABASE databasename; psql (或任何其他数据库工具)中。

但是,如果您想使用正在运行的数据库进行测试,我建议您使用testcontainers 每次运行测试时,它们都会生成一个新的 PostgreSQL 服务器和一个空数据库。


请注意,FastAPI 文档中的示例工作方式不同。 他们只是用

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
Base.metadata.create_all(bind=engine)

创建数据库。 这有效,因为 SQLite 不作为服务器运行。 它只是代表完整数据库的一个文件,如果该文件不存在,sqlite 数据库适配器将假定数据库只是空的,并为您创建一个新文件。 PostgreSQL 虽然不是这样工作的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM