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