Skip to content

Commit 0e4606c

Browse files
committed
✨ Enhance database configuration with dynamic connection mapping and introduce DbParams and DbExtraApp models
1 parent ea0ebb4 commit 0e4606c

File tree

2 files changed

+70
-5
lines changed

2 files changed

+70
-5
lines changed

src/config/models.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from typing import Any, Literal, overload, override
55

6-
from pydantic import BaseModel
6+
from pydantic import BaseModel, ConfigDict, Field
77

88
type Extension = dict[str, Any]
99

@@ -68,9 +68,29 @@ class UseConfig(BaseModel):
6868
backend: bool = False
6969

7070

71+
class DbParams(BaseModel):
72+
model_config = ConfigDict(serialize_by_alias=True)
73+
minsize: int | None = None
74+
maxsize: int | None = None
75+
max_queries: int | None = None
76+
max_inactive_connection_lifetime: float | None = None
77+
schema_name: str | None = Field(
78+
alias="schema", validation_alias="schema", serialization_alias="schema", default=None
79+
)
80+
ssl: bool | None = None
81+
82+
83+
class DbExtraApp(BaseModel):
84+
url: str | None = None
85+
params: DbParams | None = None
86+
models: list[str] = []
87+
88+
7189
class DbConfig(BaseModel):
7290
url: str
7391
enabled: bool = True
92+
params: DbParams | None = None
93+
extra_apps: dict[str, DbExtraApp] = {}
7494

7595

7696
class Config(BaseModel):

src/database/config/__init__.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,67 @@
11
# Copyright (c) NiceBots
22
# SPDX-License-Identifier: MIT
33

4+
from collections import defaultdict
45
from logging import getLogger
56

67
import aerich
78
from tortoise import Tortoise
89

910
from src.config import config
11+
from src.config.models import DbExtraApp, DbParams
1012

1113
logger = getLogger("bot").getChild("database")
1214

15+
16+
def apply_params(uri: str, params: DbParams | None) -> str:
17+
if params is None:
18+
return uri
19+
20+
first: bool = True
21+
for param, value in params.model_dump().items():
22+
if value is not None:
23+
uri += f"{'?' if first else '&'}{param}={value}"
24+
first = False
25+
return uri
26+
27+
28+
app_url_mapping: dict[str, str] = {
29+
app_name: apply_params(app_config.url or config.db.url, app_config.params)
30+
for app_name, app_config in config.db.extra_apps.items()
31+
}
32+
33+
url_apps_mapping: dict[str, list[str]] = defaultdict(list)
34+
35+
for app_name, app_url in app_url_mapping.items():
36+
url_apps_mapping[app_url].append(app_name)
37+
38+
app_connections_mapping: dict[str, str] = {}
39+
connection_url_mapping: dict[str, str] = {}
40+
41+
i: int = 0
42+
43+
for url, apps in url_apps_mapping.items():
44+
connection_name = f"connection_{i}"
45+
connection_url_mapping[connection_name] = url
46+
for app in apps:
47+
app_connections_mapping[app] = connection_name
48+
i += 1 # noqa: SIM113 # Incompatible with .items()
49+
50+
app_connections_mapping["models"] = "default"
51+
connection_url_mapping["default"] = apply_params(config.db.url, config.db.params)
52+
53+
config.db.extra_apps["models"] = DbExtraApp(
54+
models=["src.database.models", "aerich.models"],
55+
)
56+
1357
TORTOISE_ORM = {
14-
"connections": {"default": config.db.url},
58+
"connections": connection_url_mapping,
1559
"apps": {
16-
"models": {
17-
"models": ["src.database.models", "aerich.models"],
18-
"default_connection": "default",
60+
app_name: {
61+
"models": app.models,
62+
"default_connection": app_connections_mapping[app_name],
1963
}
64+
for app_name, app in config.db.extra_apps.items()
2065
},
2166
}
2267

0 commit comments

Comments
 (0)