Saltar al contenido

¿Cómo puedo verificar la conexión de la base de datos a mysql en django?

Necesitamos tu ayuda para difundir nuestras crónicas acerca de las ciencias informáticas.

Solución:

Todo lo que necesita hacer es iniciar una aplicación y, si no está conectada, fallará. Otra forma en que puede intentarlo es en Shell, intente seguir:

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

Uso el siguiente comando de administración de Django llamado 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!'))

Suponiendo que necesitara esto debido a la ventana acoplable, PERO no se limita a la ventana acoplable, recuerde que esto es al final del día Bash y, por lo tanto, funciona en todas partes * NIX.

Primero tendrá que estar usando django-environ, ya que hará esto mucho más fácil.

El DATABASE_URL La variable de entorno se usará dentro de su aplicación Django, y aquí. Su configuración se vería así:

import environ

env = environ.Env()

...

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


...

Sus variables de entorno deberían verse así: (más información aquí)

# This works with ALL the databases django supports ie (mysql/mssql/sqlite/...)
DATABASE_URL=postgres://user:[email protected]_of_box:5432/database_name
DATABASE_OTHER_URL=oracle://user:[email protected]/(description=(address=(host=name_of_box)(protocol=tcp)(port=1521))(connect_data=(SERVICE_NAME=EX)))

dentro de tu entrypoint.sh haz algo como esto:

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

Entonces, digamos que quiere esperar a su base de datos principal [the postgres in this case], agregas esto dentro del mismo entrypoint.sh, bajo la database_ready función.

until database_ready DATABASE_URL; do
  >&2 echo "Main DB is unavailable - sleeping"
  sleep 1
done

Esto solo continuará, SI postgres está en funcionamiento. ¿Qué pasa con el oráculo? Lo mismo, bajo el código anterior, agregamos:

until database_ready DATABASE_OTHER_URL; do
  >&2 echo "Secondary DB is unavailable - sleeping"
  sleep 1
done

Hacerlo de esta manera te dará un par de ventajas:

  1. no necesita preocuparse por otras dependencias, como archivos binarios y similares.

  2. puede cambiar de base de datos y no tener que preocuparse por esta ruptura. (el código es 100% independiente de la base de datos)

Aquí puedes ver las reseñas y valoraciones de los usuarios

Si conservas algún titubeo o forma de aclararse nuestro reseña puedes ejecutar una nota y con placer lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *