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

Django项目连接MariaDB报错Unknown MySQL server host 'db' 如何解决?

问题描述

使用Django开发项目时,尝试从数据库生成DataFrame遇到以下错误:

(mysql.connector.errors.DatabaseError) 2005 (HY000): Unknown MySQL server host 'db' (8)

相关代码与配置信息如下:

views.py 代码

from sqlalchemy import create_engine, text
def user_detail(req, id):
    engine = create_engine("mysql+mysqlconnector://user:mariadb@db:9051/mariadb")
    query = "SELECT * FROM LoanParcel"
    df = pd.read_sql_query(sql=text(query), con=engine.connect())
    df = df.drop(["id", "date_add", "start_date", "description"], axis = 1)
    return render(req,'pages/user_detail.html')

docker-compose.yml 配置

version: '3.7'
services:
  db:
    image: mariadb:10
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=mariadb
      - MYSQL_DATABASE=mariadb
      - MYSQL_USER=mariadb
      - MYSQL_PASSWORD=mariadb
      - MARIADB_ROOT_PASSWORD=mysecretpassword
    ports:
      - 9051:3306
    volumes:
      - "mysqldata:/var/lib/mysql"

  web:
    build: .
    restart: always
    command: python manage.py runserver 0.0.0.0:8000
    environment:
      - DATABASE_URL=mysql+mysqlconnector://user:mariadb@db:9051/mariadb
    ports:
      - "9052:8000"
    depends_on:
      - db
      
volumes:
  mysqldata:

docker-compose ps 输出

NAME                       COMMAND                  SERVICE             STATUS              PORTS
myproject-uborrowu-db-1    "docker-entrypoint.s…"   db                  running             0.0.0.0:3306->3306/tcp
myproject-uborrowu-web-1   "python manage.py ru…"   web                 running             0.0.0.0:8000->8000/tcp

解决方案

错误核心是web容器无法正常访问db服务,结合配置细节,按以下步骤修复:

  1. 修正数据库连接参数

    • 从docker-compose配置可知,db服务创建的数据库用户是mariadb,而非代码中的user;容器间通信需使用数据库内部端口3306,而非映射到宿主机的9051。
    • 修改views.py中的连接字符串:
      engine = create_engine("mysql+mysqlconnector://mariadb:mariadb@db:3306/mariadb")
      
    • 同步修正web服务的环境变量:
      - DATABASE_URL=mysql+mysqlconnector://mariadb:mariadb@db:3306/mariadb
      
  2. 确保容器在同一网络
    Docker Compose默认会为项目创建专属网络,所有服务自动加入该网络。若之前手动修改过网络配置,执行以下命令检查容器网络归属:

    # 查看db容器网络信息
    docker inspect myproject-uborrowu-db-1 | grep -A 10 "Networks"
    # 查看web容器网络信息
    docker inspect myproject-uborrowu-web-1 | grep -A 10 "Networks"
    

    若网络不一致,重启docker-compose重建网络:

    docker-compose down
    docker-compose up -d
    
  3. 等待数据库服务就绪
    depends_on仅保证启动顺序,不确保db服务完全就绪。可在web服务中添加启动等待脚本:

    web:
      build: .
      restart: always
      # 等待db端口可访问后再启动Django
      command: sh -c "until nc -z db 3306; do sleep 1; done; python manage.py runserver 0.0.0.0:8000"
      environment:
        - DATABASE_URL=mysql+mysqlconnector://mariadb:mariadb@db:3306/mariadb
      ports:
        - "9052:8000"
      depends_on:
        - db
    

    注意:若web镜像无nc命令,需在Dockerfile中添加安装命令:RUN apt-get update && apt-get install -y netcat

  4. 测试容器间连通性
    进入web容器,测试是否能ping通db服务:

    docker exec -it myproject-uborrowu-web-1 ping db
    

    若ping不通,重启docker-compose重试。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:46:06