簡體   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