Files
website/utils/db_check.py

101 lines
3.3 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy import text
import time
def check_db_connection(db, app=None):
"""
Überprüft die Datenbankverbindung und versucht ggf. die Verbindung wiederherzustellen
Args:
db: SQLAlchemy-Instanz
app: Flask-App-Instanz (optional, falls nicht im App-Kontext)
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
if app:
with app.app_context():
db.session.execute(text('SELECT 1'))
else:
# Versuche ohne expliziten App-Kontext (falls bereits im Kontext)
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
except Exception as e:
print(f"Allgemeiner Fehler bei DB-Check: {str(e)}")
retry_count += 1
if retry_count < max_retries:
time.sleep(1)
return False
def initialize_db_if_needed(db, initialize_function=None, app=None):
"""
Initialisiert die Datenbank, falls erforderlich
Args:
db: SQLAlchemy-Instanz
initialize_function: Funktion, die aufgerufen wird, um die Datenbank zu initialisieren
app: Flask-App-Instanz (optional, falls nicht im App-Kontext)
Returns:
bool: True, wenn die Datenbank bereit ist, sonst False
"""
# Prüfe die Verbindung
if not check_db_connection(db, app):
return False
# Prüfe, ob die Tabellen existieren
try:
if app:
with app.app_context():
# Führe eine Testabfrage auf einer Tabelle durch
db.session.execute(text('SELECT COUNT(*) FROM user'))
else:
# Versuche ohne expliziten App-Kontext
db.session.execute(text('SELECT COUNT(*) FROM user'))
except SQLAlchemyError:
# Tabellen existieren nicht, erstelle sie
try:
if app:
with app.app_context():
db.create_all()
# Rufe die Initialisierungsfunktion auf, falls vorhanden
if initialize_function and callable(initialize_function):
initialize_function()
else:
db.create_all()
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
except Exception as e:
print(f"Fehler beim Prüfen der Datenbank-Tabellen: {str(e)}")
return False
return True