web-dev-qa-db-fra.com

comment puis-je vérifier la connexion de base de données à MySQL dans Django

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()
11
doniyor

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
19
Mutant

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!'))
1
LondonAppDev

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!

0
radtek