[PYTHON] J'ai fait une commande pour attendre que Django démarre jusqu'à ce que la base de données soit prête

Il n'était pas pratique d'utiliser Docker-compose, alors je l'ai fait.

https://github.com/pistatium/dj_database_waiter

Qu'est-ce que c'est ça

Une commande Python qui attend juste qu'une connexion à la base de données soit établie.

 dj_database_waiter myproject.settings

Tout ce que vous avez à faire est de passer le module de configuration Django en argument. (Arrêtez strictement)

Lorsque DB et Django sont démarrés avec docker-compose, Docker attend que le conteneur côté Django démarre jusqu'à ce que la communication réseau minimale soit possible (?), Mais jusqu'à l'initialisation telle que l'entrée SQL initiale. N'attendra pas fermement. Il démarre sans autorisation et le conteneur se termine sans autorisation. Dur Même si vous recherchez la solution avec StackOverflow, il est écrit que vous devez attendre qu'elle soit préparée avec un script shell, ce qui est assez pénible. Je ne veux pas installer le client DB sur le Docker de Python juste pour vérifier la communication ...

Il est donc préférable d'écrire un script pour vérifier la communication en Python. Cependant, j'ai pensé qu'il serait gênant de copier le script pour chaque projet et de transmettre les informations de connexion séparément de Django, alors je l'ai transformé en commande et l'ai entré avec pip.

Au début, je l'ai implémentée en tant que commande Django afin qu'elle puisse être appelée depuis admin.py, mais j'ai remarqué que le démarrage de la sous-commande lui-même échouait avant le démarrage de la base de données et je l'ai réécrit comme une commande normale qui crie.

utilisation

docker-compose.yml


version: '3'

services:
  web:
    build: .
    command: python3 myproject/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/src
    ports:
      - 8000:8000
    depends_on:
      - db
  db:
    image: mysql
    volumes:
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      - db-volume:/var/lib/mysql
volumes:
  db-volume:

S'il ne démarre pas une fois lorsque vous téléchargez docker-compose comme celui-ci, installez dj_database_waiter au moment de la construction.

docker-compose.yml


    command: /bin/sh dj_database_waiter myproject.settings && python3 myproject/manage.py runserver 0.0.0.0:8000

Si vous remplacez une commande comme celle-ci, vous pourrez la démarrer une fois.

Bonus: NamedTuple Fun

dj_database_waiter veut utiliser à partir de la saisie.NamedTuple, donc ** seulement ** nécessite Python 3.6.1 ou supérieur. Veuillez le comprendre.

dj_database_waiter/cmd.py


class DbStatus(NamedTuple):
    ok: bool
    reason: str = None


def check_status(db_group_name: str) -> DbStatus:
    try:
        ...
    except Exception as e:  # NOQA
        return DbStatus(ok=False, reason=str(e))
    return DbStatus(ok=True)

Puisqu'il y a deux arguments, il n'est presque pas nécessaire d'utiliser NamedTuple, mais il peut être écrit d'une manière facile à comprendre comme celle-ci. C'est similaire à CaseClass dans Scala. J'écris également des informations de type, donc si je les écris en utilisant un IDE comme IntelliJ, il effectuera une interpolation croustillante et une vérification des erreurs, ce qui est très bon pour la santé mentale. (En passant, le type d'exécution n'est pas vérifié, donc même si vous entrez le mauvais type, cela fonctionnera.)

Recommended Posts

J'ai fait une commande pour attendre que Django démarre jusqu'à ce que la base de données soit prête
J'ai fait une commande pour marquer le clip de la table
J'ai fait une commande pour générer un commentaire pour une table dans Django
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
Fait une commande pour FizzBuzz
Je veux démarrer un environnement Jupyter avec une seule commande
Je vous ai fait exécuter des commandes depuis un navigateur WEB
Je veux créer un Dockerfile pour le moment.
J'ai fait une commande lo qui est plus utile que ls
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
Démarrez Django pour la première fois
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
Écrivain AtCoder J'ai écrit un script qui regroupe les concours pour chaque écrivain
J'ai créé un konoha de bibliothèque qui fait passer le tokenizer à une belle sensation
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
[Langage C] Ma locomotive est trop lente ~ J'ai fait une commande sl ~
J'ai créé un docset de tableau de bord pour Holoviews
J'ai fait un script pour afficher des pictogrammes
J'ai fait une bibliothèque pour l'assurance actuarielle
J'ai fait une application WEB avec Django
J'ai fait un outil pour estimer le temps d'exécution de cron (+ débuts de PyPI)
J'ai essayé de résumer les paramètres des différentes bases de données de Django (MySQL, PostgreSQL)
J'ai essayé d'expliquer à quoi sert le générateur Python aussi facilement que possible.
Notez la solution car django n'a pas pu s'installer avec pip
Je veux ajouter du silence pendant 1 seconde au début d'un fichier wav
J'ai créé un outil pour générer du Markdown à partir du fichier JSON Scrapbox exporté
Affichons un template simple idéal pour le premier Django
J'ai recherché les compétences nécessaires pour devenir ingénieur web avec Python
J'ai créé un outil pour sauvegarder automatiquement les métadonnées de l'organisation Salesforce
J'ai créé un programme pour rechercher des mots sur la fenêtre (développement précédent)
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
J'ai créé un fichier de dictionnaire python pour Neocomplete
J'ai fait un algorithme de rechange2 moins cher pour uWSGI
J'ai créé un outil utile pour Digital Ocean
J'ai créé un téléchargeur pour l'expression distribuée par mot
J'ai créé un outil pour compiler nativement Hy
J'ai créé un outil pour obtenir de nouveaux articles
Nous avons créé un produit de prévention du télétravail.
Créez une commande pour obtenir le journal de travail
Je souhaite télécharger une application Django sur heroku
[LPIC 101] J'ai essayé de résumer les options de commande qui sont faciles à faire une erreur
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
[Django] Appuyez sur une commande que vous avez effectuée à partir du processus qui s'exécute sur manage.py.
Je ne peux pas dormir tant que je n'ai pas construit un serveur !! (Introduction au serveur Python faite en un jour)
Une commande pour vérifier si quelque chose ne va pas lorsque le serveur ne fait rien
J'ai oublié d'utiliser VIM, j'ai donc fait une vidéo pour la mémorisation. 3 vidéos par niveau
Comment écrire une interface graphique à l'aide de la commande maya
Création de l'outil de gestion des utilisateurs Let's Chat
Je veux faire défiler la table de décalage Django, mais ...
J'ai fait une bibliothèque pour bien séparer les phrases japonaises
Qu'est-ce qu'un chien? Volume de démarrage de la création de l'application Django --startapp