You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI中Django测试设置APP_ENV为local仍默认使用PostgreSQL而非SQLite的问题

解决GitLab CI中Django测试未按APP_ENV切换数据库的问题

看起来你遇到的核心问题是:明明在CI中设置了APP_ENV=local,但测试却还是尝试连接PostgreSQL,这说明你的Django配置没有正确加载local.py里的SQLite数据库设置。下面是一步步的排查和修复方案:

1. 先确认CI环境中APP_ENV变量是否真的生效

GitLab CI的变量有时可能会被项目级/组级的环境变量覆盖,或者传递过程中出现问题。先在测试脚本里添加打印命令,验证变量值:

backend:test:
  stage: test
  image: python:3.13-slim
  variables:
    APP_ENV: local
  # 先移除postgres服务,local环境不需要它,避免干扰
  # services:
  #   - name: postgres:15-alpine
  #     alias: postgres
  script:
    - echo "当前APP_ENV值: $APP_ENV"
    - printenv | grep APP_ENV
    - uv run python manage.py shell -c "from django.conf import settings; print('当前数据库引擎:', settings.DATABASES['default']['ENGINE'])"
    - uv run python manage.py test

运行这个job后,查看输出:

  • 如果APP_ENV不是local,说明变量被覆盖了,需要检查项目的Settings > CI/CD > Variables里有没有全局设置的APP_ENV(全局变量优先级比job级变量高)。
  • 如果APP_ENV是local但数据库引擎显示django.db.backends.postgresql,说明你的settings/__init__.py逻辑有问题。

2. 排查settings配置加载逻辑

在settings/__init__.py里添加日志,确认配置加载路径:

import os
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

APP_ENV = os.getenv("APP_ENV", "local")
logger.info(f"加载配置环境: {APP_ENV}")

if APP_ENV == "local":
    logger.info("导入local.py的数据库配置")
    from .local import DATABASES
elif APP_ENV == "production":
    logger.info("导入production.py的数据库配置")
    from .production import DATABASES
else:
    raise ValueError("Incorrect configuration")

然后在CI中观察日志输出,确认是否真的进入了local分支的逻辑。如果没有进入,那说明APP_ENV的值和你预期的不一致(比如大小写问题?不过你代码里是全小写)。

3. 移除不需要的PostgreSQL服务

因为你在local环境用SQLite,所以CI job里的services配置完全不需要,反而GitLab会自动给postgres服务注入POSTGRES_DB、POSTGRES_USER等环境变量,虽然这不会直接覆盖你的配置,但可能会造成混淆,建议移除这部分配置。

4. 确保SQLite依赖在CI镜像中可用

python:3.13-slim镜像默认包含SQLite的Python绑定,但如果你的Django版本需要额外的依赖,可以在脚本里添加检查:

script:
    - python -c "import sqlite3; print('SQLite模块可用')"
    # 其他命令...

如果这里报错,说明镜像缺少SQLite支持,可以换成python:3.13(非slim版本),或者安装sqlite3开发包:

script:
    - apt-get update && apt-get install -y libsqlite3-dev
    - python -c "import sqlite3; print('SQLite模块可用')"
    # 其他命令...

5. 检查是否有其他配置覆盖DATABASES

比如:

  • 你的base.py里是否定义了DATABASES,并且local.py没有正确覆盖它?(看你的代码,local.py是直接重新定义了DATABASES,所以应该没问题,但可以确认)
  • 是否有其他脚本(比如manage.py、wsgi.py)在加载settings之前修改了APP_ENV环境变量?
  • 是否使用了django-environ等配置工具,不小心读取了环境变量中的数据库配置?

最后,修复后的CI配置示例

backend:test:
  stage: test
  image: python:3.13-slim
  variables:
    APP_ENV: local
  script:
    - pip install uv  # 如果镜像没有预装uv
    - uv sync  # 安装项目依赖,假设你用uv.lock
    - echo "当前APP_ENV: $APP_ENV"
    - uv run python manage.py shell -c "from django.conf import settings; print('数据库引擎:', settings.DATABASES['default']['ENGINE'])"
    - uv run python manage.py test

按照这些步骤排查,应该能找到问题所在,让测试正确使用SQLite数据库。

内容的提问来源于stack exchange,提问作者fluxio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 09:52:32