如何针对PostgreSQL应用运行pytest?数据库已存在报错排查
GitLab CI配置报错排查与修复
报错原因
- 自动创建数据库引发重复操作:GitLab CI的
postgres服务会自动读取POSTGRES_DB变量,在启动阶段就创建对应数据库。你在before_script中手动执行CREATE DATABASE $POSTGRES_DB;,触发了重复创建的错误(报错信息里的"postgres"是变量解析异常导致的显示问题,实际是重复创建logbook数据库)。 - 连接命令逻辑错误:执行
psql -h postgres -U $POSTGRES_USER -d $POSTGRES_DB -c "CREATE DATABASE $POSTGRES_DB;"时,-d $POSTGRES_DB要求先连接目标数据库,但此时数据库尚未完成自动创建(服务启动有延迟),会先触发连接失败,进而导致后续命令执行异常。 - 变量格式错误:
POSTGRES_PORT使用了HTML实体"5432",会导致变量解析异常,应该替换为普通双引号或直接写端口号。
修复后的配置
修改logbook_test_job部分内容如下:
logbook_test_job: stage: test image: python:latest services: - postgres:latest variables: POSTGRES_USER: postgres POSTGRES_PASSWORD: mysecretpassword POSTGRES_HOST: postgres POSTGRES_PORT: "5432" # 修正为普通双引号 POSTGRES_DB: logbook before_script: - apt-get update -y - apt-get install -y postgresql-client - export PGPASSWORD=$POSTGRES_PASSWORD # 移除手动创建数据库的命令,由postgres服务自动完成创建 - cd logbook - python --version - pip install poetry - poetry install script: - poetry run alembic upgrade head - poetry run pytest tests
额外优化建议
- 移除
poetry update:CI环境应依赖poetry.lock锁定依赖版本,避免每次更新导致测试环境不一致,仅保留poetry install即可。 - 增加数据库连接等待:如果postgres服务启动较慢,可在
before_script中加入等待逻辑,确保数据库就绪后再执行后续操作:- until psql -h $POSTGRES_HOST -U $POSTGRES_USER -d $POSTGRES_DB -c '\q'; do echo "Waiting for postgres..."; sleep 2; done
内容的提问来源于stack exchange,提问作者majesty
相关产品推荐
相关产品推荐

