Django / Docker-compose:重试数据库连接时:django.db.utils.OperationalError:(2002,“无法连接到'db'(115)上的MySQL服务器”)

Posted

技术标签:

【中文标题】Django / Docker-compose:重试数据库连接时:django.db.utils.OperationalError:(2002,“无法连接到\'db\'(115)上的MySQL服务器”)【英文标题】:Django/Docker-compose: Retry Database Connection when: django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")Django / Docker-compose:重试数据库连接时:django.db.utils.OperationalError:(2002,“无法连接到'db'(115)上的MySQL服务器”) 【发布时间】:2021-01-16 01:56:30 【问题描述】:

已在此处提出此问题:django.db.utils.OperationalError: (2002, "Can't connect to mysql server on 'db' (115)"),答案是等待数据库准备好。

但是,官方文档在这里:https://docs.docker.com/compose/startup-order/ 建议改为实现应用内重试方法,以便在失败时重试数据库连接。

要处理此问题,请将您的应用程序设计为在发生故障后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。

最好的解决方案是在您的应用程序代码中执行此检查,无论是在启动时还是由于任何原因失去连接时。

不幸的是,文档仅止于此,并没有提供有关如何实现此重试方法的任何示例或指南。有谁知道如何以干净的方式做到这一点?

【问题讨论】:

【参考方案1】:

在manage.py中重启django cassandra连接

   #!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import logging
import os
import sys
from time import sleep

from cassandra.cluster import NoHostAvailable
from django.core.management import execute_from_command_line

MAX_RETRIES_NUM = 10

def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
    try:
        from django.core.management.commands.runserver import Command
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc

    from django.db import connections
    conn = connections['default']
    no_host_available = True
    retry_count = 0
    sleep_time = 1

    while no_host_available:
        try:
            conn.connect()
        except NoHostAvailable:
            if retry_count == MAX_RETRIES_NUM:
                sys.exit()
            logging.warning(f'Error de conexión con la base de datos. Reintentando conexión en sleep_times')
            sleep(sleep_time)
        else:
            no_host_available = False

        sleep_time *= 1.5
        retry_count += 1

    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

【讨论】:

以上是关于Django / Docker-compose:重试数据库连接时:django.db.utils.OperationalError:(2002,“无法连接到'db'(115)上的MySQL服务器”)的主要内容,如果未能解决你的问题,请参考以下文章

使用 docker-compose 链接 django 和 mysql 容器

docker-compose 和 django 出错

通过主管和 docker-compose 从 django 输出彩色日志

django 无法在 docker-compose 中连接 mysql

Docker-compose实战——Django+PostgreSQL

docker-compose 与 postgres 的 Django 连接