[PYTHON] Ich habe einen Befehl gegeben, auf den Start von Django zu warten, bis die Datenbank bereit ist

Es war unpraktisch, Docker-Compose zu verwenden, also habe ich es geschafft.

https://github.com/pistatium/dj_database_waiter

was ist das

Ein Python-Befehl, der nur darauf wartet, dass eine Datenbankverbindung hergestellt wird.

 dj_database_waiter myproject.settings

Sie müssen lediglich das Django-Konfigurationsmodul als Argument übergeben. (Streng aufhören)

Wenn DB und Django mit Docker-Compose gestartet werden, wartet Docker darauf, dass der Django-Seitencontainer gestartet wird, bis die minimale Netzwerkkommunikation möglich ist (?), Aber bis zur Initialisierung wie der anfänglichen SQL-Eingabe. Wird nicht fest warten. Es beginnt ohne Erlaubnis und der Container endet ohne Erlaubnis. Hart Selbst wenn Sie die Lösung mit StackOverflow nachschlagen, müssen Sie warten, bis sie mit einem Shell-Skript vorbereitet ist, was ziemlich schmerzhaft ist. Ich möchte den DB-Client nicht auf Pythons Docker installieren, nur um die Kommunikation zu überprüfen ...

Es ist daher besser, ein Skript zu schreiben, um die Kommunikation in Python zu überprüfen. Ich dachte jedoch, es wäre mühsam, das Skript für jedes Projekt zu kopieren und die Verbindungsinformationen getrennt von Django zu übergeben, also machte ich es zu einem Befehl und gab es mit pip ein.

Zuerst habe ich es als Django-Befehl implementiert, damit es von admin.py aufgerufen werden kann, aber ich habe festgestellt, dass der Start des Unterbefehls selbst vor dem Start der Datenbank fehlgeschlagen ist, und habe ihn als normalen Befehl, der weint, neu geschrieben.

verwenden

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:

Wenn es beim Hochladen von Docker-Compose wie folgt nicht einmal gestartet wird, installieren Sie dj_database_waiter zur Erstellungszeit.

docker-compose.yml


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

Wenn Sie den Befehl wie folgt ersetzen, können Sie ihn einmal starten.

Bonus: NamedTuple Fun

dj_database_waiter möchte from typing.NamedTuple verwenden, daher erfordert ** nur ** Python 3.6.1 oder höher. Bitte verstehe es.

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)

Da es zwei Argumente gibt, ist es fast nicht erforderlich, NamedTuple zu verwenden, aber es kann auf eine leicht verständliche Weise wie diese geschrieben werden. Es ist ähnlich wie bei CaseClass in Scala. Ich schreibe auch Typinformationen. Wenn ich sie also mit einer IDE wie IntelliJ schreibe, führt sie eine knusprige Interpolation und Fehlerprüfung durch, was für die psychische Gesundheit sehr gut ist. (Der Laufzeittyp wird übrigens nicht überprüft. Selbst wenn Sie den falschen Typ eingeben, funktioniert er.)

Recommended Posts

Ich habe einen Befehl gegeben, auf den Start von Django zu warten, bis die Datenbank bereit ist
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Ich habe einen Befehl zum Generieren eines Kommentars für eine Tabelle in Django eingegeben
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Ich möchte zum ersten Mal eine Django-Studie zur Mittagsdatenbank [EP1] erstellen
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
Befehl für FizzBuzz erstellt
Ich möchte eine Jupyter-Umgebung mit einem Befehl starten
Ich habe Sie dazu gebracht, Befehle über einen WEB-Browser auszuführen
Ich möchte vorerst eine Docker-Datei erstellen.
Ich habe einen lo-Befehl erstellt, der nützlicher ist als ls
Ich habe eine Entwicklungsumgebung für Django 3.0 mit Docker, Docker-Compose und Poetry erstellt
Starten Sie Django zum ersten Mal
Ich habe einen Docker-Container erstellt, um JUMAN ++, KNP, Python (für pyKNP) zu verwenden.
AtCoder-Autor Ich habe ein Skript geschrieben, das Wettbewerbe für jeden Autor zusammenfasst
Ich habe eine Bibliothek konoha gemacht, die den Tokenizer auf ein schönes Gefühl umstellt
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
[C Sprache] Meine Lokomotive ist zu langsam ~ Ich habe einen Sl-Befehl gegeben ~
Ich habe ein Dash-Docset für Holoviews erstellt
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
Ich habe eine Bibliothek für versicherungsmathematische Versicherungen erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe ein Tool erstellt, um die Ausführungszeit von cron zu schätzen (+ PyPI-Debüt)
Ich habe versucht, die Einstellungen für verschiedene Datenbanken von Django (MySQL, PostgreSQL) zusammenzufassen.
Ich habe versucht zu erklären, wozu der Python-Generator so einfach wie möglich ist.
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Ich möchte dem Anfang einer WAV-Datei 1 Sekunde lang Stille hinzufügen
Ich habe ein Tool zum Generieren von Markdown aus der exportierten Scrapbox-JSON-Datei erstellt
Lassen Sie uns eine einfache Vorlage anzeigen, die ideal für den ersten Django ist
Ich suchte nach den Fähigkeiten, die erforderlich sind, um Webingenieur bei Python zu werden
Ich habe ein Tool zum automatischen Sichern der Metadaten der Salesforce-Organisation erstellt
Ich habe ein Programm erstellt, um Wörter im Fenster nachzuschlagen (vorherige Entwicklung)
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
Ich habe einen Ersatz2-Algorithmus für uWSGI billiger gemacht
Ich habe ein nützliches Tool für Digital Ocean erstellt
Ich habe einen Downloader für wortverteilte Ausdrücke erstellt
Ich habe ein Tool erstellt, um Hy nativ zu kompilieren
Ich habe ein Tool erstellt, um neue Artikel zu erhalten
Wir haben ein Peeping-Prevention-Produkt für die Telearbeit entwickelt.
Erstellen Sie einen Befehl, um das Arbeitsprotokoll abzurufen
Ich möchte eine Django-App auf Heroku hochladen
[LPIC 101] Ich habe versucht, die Befehlsoptionen zusammenzufassen, die leicht zu Fehlern führen können
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
[Django] Drücken Sie einen Befehl, den Sie in dem Prozess ausgeführt haben, der auf manage.py ausgeführt wird.
Ich kann nicht schlafen, bis ich einen Server erstellt habe !! (Einführung in den Python-Server an einem Tag)
Ein Befehl zum Überprüfen, wenn etwas schief geht, wenn der Server nichts tut
Ich habe vergessen, VIM zu bedienen, also habe ich ein Video zum Auswendiglernen gemacht. 3 Videos nach Level
So schreiben Sie eine GUI mit dem Befehl maya
Lassen Sie uns Chat-Benutzerverwaltungstool gemacht
Ich möchte in der Django-Verschiebungstabelle scrollen, aber ...
Ich habe eine Bibliothek erstellt, um japanische Sätze schön zu brechen
Was ist ein Hund? Startvolumen der Django-App erstellen --startapp