我在下面的代码中做错了什么,因为我仍然得到错误:
ERROR: database "postgres" already exists
ERROR: Job failed: exit code 1
应用程序使用PostgreSQL,我想运行它,然后运行测试。
stages:
- pre-commit
- test
pre-commit:
stage: pre-commit
image: python:latest
before_script:
- cd logbook
- python --version
- pip install poetry
- poetry install
- poetry update
script:
- poetry run black --diff --check -q . || true
- poetry run flake8 . || true
- poetry run pylint src tests --recursive y || true
- poetry run mypy . --explicit-package-bases || true
only:
- merge_requests
- push
sast:
stage: test
include:
- template: Security/SAST.gitlab-ci.yml
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
# - psql -h postgres -U $POSTGRES_USER -d postgres -c "DROP DATABASE IF EXISTS $POSTGRES_DB;"
- psql -h postgres -U $POSTGRES_USER -d $POSTGRES_DB -c "CREATE DATABASE $POSTGRES_DB;"
- cd logbook
- python --version
- pip install poetry
- poetry install
- poetry update
script:
- poetry run alembic upgrade head
- poetry run pytest tests
2条答案
按热度按时间7qhs6swi1#
我猜这个错误不是由您显示的配置的确切版本引起的。
如果试图告诉
psql
连接到名为logbook
的数据库,然后从该数据库中创建该数据库,则此操作将失败。如果logbook
还不存在,连接将失败。如果它已经存在,CREATE
语句将由于名称冲突而失败。你需要两个psql调用都指向-d postgres
而不是-d $POSTGRES_DB
。您可能还希望在尝试
CREATE
数据库之前取消注解DROP
语句。否则,重新启动将导致冲突。bejyjqdl2#
当您定义
POSTGRES_DB
时,数据库(在本例中为logbook
)已经为您创建。来自
POSTGRES_DB
的图像文档:此可选环境变量可用于为首次启动映像时创建的默认数据库定义不同的名称。如果未指定,则将使用POSTGRES_USER的值。
因此,这一行(由于其他原因而有问题)是不需要的,可以删除:
这一行没有任何意义,因为尝试与
-d $POSTGRES_DB
连接需要数据库已经存在--因此,如果连接成功,此命令将总是失败。您 * 通常 * 不需要对
psql
做任何事情,除非您需要加载一些模拟数据、创建其他用户或类似的事情。但是,在你需要运行命令来创建额外的数据库、用户或类似的东西的情况下,你可以连接到内置的
template1
数据库,它将永远存在:不过,您可能更喜欢使用
createdb
或createuser
之类的命令。