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)
小智 10
运行外壳
python manage.py shell
Run Code Online (Sandbox Code Playgroud)
执行这个脚本
python manage.py shell
Run Code Online (Sandbox Code Playgroud)
如果它打印None意味着一切正常,否则如果您的数据库连接出现问题,它将抛出错误
我使用以下 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)
这是一个老问题,但需要更新的答案
python manage.py check --database default
Run Code Online (Sandbox Code Playgroud)
如果您不使用默认值,或者您想测试设置中列出的其他数据库,只需将其命名即可。
从 3.1 + 版本开始可用
检查文档
假设你因为 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)
这样做会给你带来几个好处:
您无需担心其他依赖项,例如二进制文件等。
您可以切换数据库而不必担心这种破坏。(代码是 100% 数据库不可知的)
| 归档时间: |
|
| 查看次数: |
23989 次 |
| 最近记录: |