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:
-
no necesita preocuparse por otras dependencias, como archivos binarios y similares.
-
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.