[英]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.