如何在django中检查数据库与mysql的连接

don*_*yor 14 python django django-settings

我该怎么做?

我想,我可以从数据库中读取一些东西,但它看起来太多了,是否有类似的东西?:

settings.DATABASES['default'].check_connection()
Run Code Online (Sandbox Code Playgroud)

Mut*_*ant 24

您需要做的就是启动一个应用程序,如果它没有连接,它将失败.你可以尝试的其他方式是在shell尝试以下 -

from django.db import connections
from django.db.utils import OperationalError
db_conn = connections['default']
try:
    c = db_conn.cursor()
except OperationalError:
    connected = False
else:
    connected = True
Run Code Online (Sandbox Code Playgroud)

  • 现在可以使用`django.db.connection.ensure_connection()` (6认同)
  • 这实际上不会起作用,直到您在游标上执行某些操作 (2认同)

小智 10

运行外壳

python manage.py shell
Run Code Online (Sandbox Code Playgroud)

执行这个脚本

python manage.py shell
Run Code Online (Sandbox Code Playgroud)

如果它打印None意味着一切正常,否则如果您的数据库连接出现问题,它将抛出错误


Lon*_*Dev 8

我使用以下 Django 管理命令wait_for_db

import time

from django.db import connection
from django.db.utils import OperationalError
from django.core.management.base import BaseCommand


class Command(BaseCommand):
    """Django command that waits for database to be available"""

    def handle(self, *args, **options):
        """Handle the command"""
        self.stdout.write('Waiting for database...')
        db_conn = None
        while not db_conn:
            try:
                connection.ensure_connection()
                db_conn = True
            except OperationalError:
                self.stdout.write('Database unavailable, waiting 1 second...')
                time.sleep(1)

        self.stdout.write(self.style.SUCCESS('Database available!'))
Run Code Online (Sandbox Code Playgroud)

  • 只是一个建议:我会为这些尝试和睡眠添加一个限制,以避免无限循环。类似于“for _ in range(10)”而不是“while”循环。 (4认同)

Fed*_*llo 7

这是一个老问题,但需要更新的答案

python manage.py check --database default
Run Code Online (Sandbox Code Playgroud)

如果您不使用默认值,或者您想测试设置中列出的其他数据库,只需将其命名即可。

从 3.1 + 版本开始可用

检查文档


Jav*_*zzi 5

假设你因为 docker 而需要这个,但不限于 docker,记住这是在一天结束时 Bash,因此适用于任何地方 *NIX。

您首先需要使用django-environ,因为它会使这一切变得更容易。

DATABASE_URL环境变量将你的Django应用程序内使用,并在这里。您的设置如下所示:

import environ

env = environ.Env()

...

DATABASES = {
    'default': env.db('DATABASE_URL'),
    'other': env.db('DATABASE_OTHER_URL')  # for illustration purposes
}

...
Run Code Online (Sandbox Code Playgroud)

你的环境变量应该是这样的:(更多信息在这里

# This works with ALL the databases django supports ie (mysql/mssql/sqlite/...)
DATABASE_URL=postgres://user:pass@name_of_box:5432/database_name
DATABASE_OTHER_URL=oracle://user:pass@/(description=(address=(host=name_of_box)(protocol=tcp)(port=1521))(connect_data=(SERVICE_NAME=EX)))
Run Code Online (Sandbox Code Playgroud)

在你里面entrypoint.sh做这样的事情:

function database_ready() {
  # You need to pass a single argument called "evironment_dsn"
  python << EOF
import sys
import environ
from django.db.utils import ConnectionHandler, OperationalError

env = environ.Env()
try:
   ConnectionHandler(databases={'default': env.db('$1')})['default'].ensure_connection()
except (OperationalError, DatabaseError):
   sys.exit(-1)
sys.exit(0)
EOF
}
Run Code Online (Sandbox Code Playgroud)

然后,假设您想等待您的主数据库 [在这种情况下为 postgres],您将其添加到相同的entrypoint.sh,database_ready函数下。

until database_ready DATABASE_URL; do
  >&2 echo "Main DB is unavailable - sleeping"
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)

如果 postgres 启动并运行,这只会继续。甲骨文呢?同样的事情,在上面的代码下,我们添加:

until database_ready DATABASE_OTHER_URL; do
  >&2 echo "Secondary DB is unavailable - sleeping"
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)

这样做会给你带来几个好处:

  1. 您无需担心其他依赖项,例如二进制文件等。

  2. 您可以切换数据库而不必担心这种破坏。(代码是 100% 数据库不可知的)