79 lines
2.4 KiB
Python
79 lines
2.4 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from flask import current_app
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
from sqlalchemy import text
|
|
import time
|
|
|
|
def check_db_connection(db):
|
|
"""
|
|
Überprüft die Datenbankverbindung und versucht ggf. die Verbindung wiederherzustellen
|
|
|
|
Args:
|
|
db: SQLAlchemy-Instanz
|
|
|
|
Returns:
|
|
bool: True, wenn die Verbindung erfolgreich ist, sonst False
|
|
"""
|
|
max_retries = 3
|
|
retry_count = 0
|
|
|
|
while retry_count < max_retries:
|
|
try:
|
|
# Führe eine einfache Abfrage durch, um die Verbindung zu testen
|
|
with current_app.app_context():
|
|
db.session.execute(text('SELECT 1'))
|
|
return True
|
|
except SQLAlchemyError as e:
|
|
retry_count += 1
|
|
print(f"DB-Verbindungsfehler (Versuch {retry_count}/{max_retries}): {str(e)}")
|
|
|
|
if retry_count < max_retries:
|
|
# Warte vor dem nächsten Versuch
|
|
time.sleep(1)
|
|
|
|
# Versuche die Verbindung zurückzusetzen
|
|
try:
|
|
db.session.rollback()
|
|
except:
|
|
pass
|
|
|
|
return False
|
|
|
|
def initialize_db_if_needed(db, initialize_function=None):
|
|
"""
|
|
Initialisiert die Datenbank, falls erforderlich
|
|
|
|
Args:
|
|
db: SQLAlchemy-Instanz
|
|
initialize_function: Funktion, die aufgerufen wird, um die Datenbank zu initialisieren
|
|
|
|
Returns:
|
|
bool: True, wenn die Datenbank bereit ist, sonst False
|
|
"""
|
|
# Prüfe die Verbindung
|
|
if not check_db_connection(db):
|
|
return False
|
|
|
|
# Prüfe, ob die Tabellen existieren
|
|
try:
|
|
with current_app.app_context():
|
|
# Führe eine Testabfrage auf einer Tabelle durch
|
|
db.session.execute(text('SELECT COUNT(*) FROM user'))
|
|
except SQLAlchemyError:
|
|
# Tabellen existieren nicht, erstelle sie
|
|
try:
|
|
with current_app.app_context():
|
|
db.create_all()
|
|
|
|
# Rufe die Initialisierungsfunktion auf, falls vorhanden
|
|
if initialize_function and callable(initialize_function):
|
|
initialize_function()
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"Fehler bei DB-Initialisierung: {str(e)}")
|
|
return False
|
|
|
|
return True |