在GitLab CI中,Django测试总是使用PostgreSQL而不是SQLite,尽管APP_ENV已被覆盖

后端开发 2026-07-11

我在GitLab CI中运行Django测试,想在SQLite(用于本地/测试)和PostgreSQL(用于生产)之间切换。
我的设置结构如下:

settings/_init_.py:

import os

APP_ENV = os.getenv("APP_ENV", "local")

if APP_ENV == "local":
    from .local import DATABASES 
elif APP_ENV == "production":
    from .production import DATABASES 
else:
    raise ValueError("Incorrect configuration")

production.py:

import os

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": os.getenv("POSTGRES_DB"),
        "USER": os.getenv("POSTGRES_USER"),
        "PASSWORD": os.getenv("POSTGRES_PASSWORD"),
        "HOST": os.getenv("POSTGRES_HOST"),
        "PORT": os.getenv("POSTGRES_PORT"),
    }
}

local.py:

from .base import BASE_DIR


DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

在GitLab CI (.gitlab-ci.yml) 中,我的测试任务长这样:

backend:test: 
    stage: test 
    image: python:3.13-slim 
    variables: 
        APP_ENV: local
    services:
       - name: postgres:15-alpine 
       alias: postgres 
    script: - uv run python manage.py test

我期望的结果

APP_ENV=local 时,测试应该使用SQLite。

实际发生了什么

测试总是使用PostgreSQL,并报错。

回溯信息

django.db.utils.OperationalError: 连接到套接字 "/var/run/[MASKED]ql/.s.PGSQL.5432" 的服务器失败:没有这样的文件或目录
服务器是否正在本地运行并在该套接字上接受连接?

解决方案

我最终解决了这个问题。我查看了关于PostgreSQL的 GitLab文档(https://docs.gitlab.com/ci/services/postgres/)以及如何在流水线中运行它的实例。需要把PostgreSQL服务添加到默认配置中,而不是放在作业内部:

default:
interruptible: true
retry: 1
services:
    - name: postgres
alias: db,postgres,pg

并添加全局变量,而不是把它们放在services中:

variables:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_HOST: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_HOST_AUTH_METHOD: trust

下面是backend:test作业:

backend:test:
stage: test
image: python:3.13-slim
before_script:
    - apt-get update && apt-get install -y python3-dev gcc libpq-dev postgresql-client
    - python -m pip install --upgrade pip
    - pip install uv
    - cd backend/api
    - uv sync --frozen
script:
    - uv run python manage.py check
    - uv run python manage.py test

感谢你的回答和评论。希望这能帮助未来遇到同样问题的朋友。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章