如何对使用PostgreSQL的应用程序运行pytest

xbp102n0  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(156)

我在下面的代码中做错了什么,因为我仍然得到错误:

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
7qhs6swi

7qhs6swi1#

我猜这个错误不是由您显示的配置的确切版本引起的。

# - 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;"

如果试图告诉psql连接到名为logbook的数据库,然后从该数据库中创建该数据库,则此操作将失败。如果logbook还不存在,连接将失败。如果它已经存在,CREATE语句将由于名称冲突而失败。你需要两个psql调用都指向-d postgres而不是-d $POSTGRES_DB
您可能还希望在尝试CREATE数据库之前取消注解DROP语句。否则,重新启动将导致冲突。

bejyjqdl

bejyjqdl2#

当您定义POSTGRES_DB时,数据库(在本例中为logbook)已经为您创建。
来自POSTGRES_DB的图像文档:
此可选环境变量可用于为首次启动映像时创建的默认数据库定义不同的名称。如果未指定,则将使用POSTGRES_USER的值。
因此,这一行(由于其他原因而有问题)是不需要的,可以删除:

- psql -h postgres -U $POSTGRES_USER -d $POSTGRES_DB -c "CREATE DATABASE $POSTGRES_DB;"

这一行没有任何意义,因为尝试与-d $POSTGRES_DB连接需要数据库已经存在--因此,如果连接成功,此命令将总是失败。
您 * 通常 * 不需要对psql做任何事情,除非您需要加载一些模拟数据、创建其他用户或类似的事情。
但是,在你需要运行命令来创建额外的数据库、用户或类似的东西的情况下,你可以连接到内置的template1数据库,它将永远存在:

# ...
    - extra_db_name="foobar"
    - psql -h postgres -U $POSTGRES_USER -d template1 -c "CREATE DATABASE $extra_db_name;"

不过,您可能更喜欢使用createdbcreateuser之类的命令。

相关问题