comment puis-je le faire?
J'ai pensé, je peux lire quelque chose dans la base de données, mais ça a l'air trop, est-ce qu'il y a quelque chose comme ?:
settings.DATABASES['default'].check_connection()
Tout ce que vous avez à faire est de démarrer une application et si elle n'est pas connectée, elle échouera. Une autre façon d'essayer est d'essayer de suivre 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
J'utilise la commande de gestion Django suivante appelée 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!'))
J'ai eu un cas plus compliqué où j'utilise mongodb derrière le module djongo et RDS mysql. Donc, non seulement il y a plusieurs bases de données, mais djongo génère une erreur SQLDecode à la place. J'ai également dû exécuter et récupérer pour que cela fonctionne:
from Django.conf import settings
if settings.DEBUG:
# Quick database check here
from Django.db import connections
from Django.db.utils import OperationalError
dbs = settings.DATABASES.keys()
for db in dbs:
db_conn = connections[db] # i.e. default
try:
c = db_conn.cursor()
c.execute("""SELECT "non_existent_table"."id" FROM "non_existent_table" LIMIT 1""")
c.fetchone()
print("Database '{}' connection ok.".format(db)) # This case is for djongo decoding sql ok
except OperationalError as e:
if 'no such table' in str(e):
print("Database '{}' connection ok.".format(db)) # This is ok, db is present
else:
raise # Another type of op error
except Exception: # djongo sql decode error
print("ERROR: Database {} looks to be down.".format(db))
raise
Je le charge dans mon application __init__.py
, car je ne veux le lancer qu’une fois au démarrage, et seulement si DEBUG est activé. J'espère que ça aide!