mirror of
https://github.com/open-webui/open-webui
synced 2025-02-22 05:08:14 +00:00
Reconnect to postgresql & mysql external databases when getting disconnected
This commit is contained in:
parent
9cd150a048
commit
dfbc125947
@ -7,6 +7,12 @@ from config import SRC_LOG_LEVELS, DATA_DIR, DATABASE_URL, BACKEND_DIR
|
|||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from peewee_migrate import Router
|
||||||
|
from playhouse.db_url import connect
|
||||||
|
|
||||||
|
from apps.webui.internal.wrappers import PeeweeConnectionState, register_peewee_databases
|
||||||
|
from config import SRC_LOG_LEVELS, DATA_DIR, DATABASE_URL
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
log.setLevel(SRC_LOG_LEVELS["DB"])
|
log.setLevel(SRC_LOG_LEVELS["DB"])
|
||||||
|
|
||||||
@ -20,6 +26,8 @@ class JSONField(TextField):
|
|||||||
return json.loads(value)
|
return json.loads(value)
|
||||||
|
|
||||||
|
|
||||||
|
register_peewee_databases()
|
||||||
|
|
||||||
# Check if the file exists
|
# Check if the file exists
|
||||||
if os.path.exists(f"{DATA_DIR}/ollama.db"):
|
if os.path.exists(f"{DATA_DIR}/ollama.db"):
|
||||||
# Rename the file
|
# Rename the file
|
||||||
@ -29,6 +37,7 @@ else:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
DB = connect(DATABASE_URL)
|
DB = connect(DATABASE_URL)
|
||||||
|
DB._state = PeeweeConnectionState()
|
||||||
log.info(f"Connected to a {DB.__class__.__name__} database.")
|
log.info(f"Connected to a {DB.__class__.__name__} database.")
|
||||||
router = Router(
|
router = Router(
|
||||||
DB,
|
DB,
|
||||||
|
59
backend/apps/webui/internal/wrappers.py
Normal file
59
backend/apps/webui/internal/wrappers.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
from contextvars import ContextVar
|
||||||
|
|
||||||
|
from peewee import PostgresqlDatabase, InterfaceError as PeeWeeInterfaceError, MySQLDatabase, _ConnectionState
|
||||||
|
from playhouse.db_url import register_database
|
||||||
|
from playhouse.pool import PooledPostgresqlDatabase, PooledMySQLDatabase
|
||||||
|
from playhouse.shortcuts import ReconnectMixin
|
||||||
|
from psycopg2 import OperationalError
|
||||||
|
from psycopg2.errors import InterfaceError
|
||||||
|
|
||||||
|
|
||||||
|
db_state_default = {"closed": None, "conn": None, "ctx": None, "transactions": None}
|
||||||
|
db_state = ContextVar("db_state", default=db_state_default.copy())
|
||||||
|
|
||||||
|
|
||||||
|
class PeeweeConnectionState(_ConnectionState):
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super().__setattr__("_state", db_state)
|
||||||
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
|
def __setattr__(self, name, value):
|
||||||
|
self._state.get()[name] = value
|
||||||
|
|
||||||
|
def __getattr__(self, name):
|
||||||
|
return self._state.get()[name]
|
||||||
|
|
||||||
|
|
||||||
|
class CustomReconnectMixin(ReconnectMixin):
|
||||||
|
reconnect_errors = (
|
||||||
|
# default ReconnectMixin exceptions (MySQL specific)
|
||||||
|
*ReconnectMixin.reconnect_errors,
|
||||||
|
# psycopg2
|
||||||
|
(OperationalError, 'termin'),
|
||||||
|
(InterfaceError, 'closed'),
|
||||||
|
# peewee
|
||||||
|
(PeeWeeInterfaceError, 'closed'),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ReconnectingPostgresqlDatabase(CustomReconnectMixin, PostgresqlDatabase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ReconnectingPooledPostgresqlDatabase(CustomReconnectMixin, PooledPostgresqlDatabase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ReconnectingMySQLDatabase(CustomReconnectMixin, MySQLDatabase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ReconnectingPooledMySQLDatabase(CustomReconnectMixin, PooledMySQLDatabase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def register_peewee_databases():
|
||||||
|
register_database(MySQLDatabase, 'mysql')
|
||||||
|
register_database(PooledMySQLDatabase, 'mysql+pool')
|
||||||
|
register_database(ReconnectingPostgresqlDatabase, 'postgres', 'postgresql')
|
||||||
|
register_database(ReconnectingPooledPostgresqlDatabase, 'postgres+pool', 'postgresql+pool')
|
Loading…
Reference in New Issue
Block a user