|
1 | 1 | # Copyright (c) NiceBots |
2 | 2 | # SPDX-License-Identifier: MIT |
3 | 3 |
|
| 4 | +from collections import defaultdict |
4 | 5 | from logging import getLogger |
5 | 6 |
|
6 | 7 | import aerich |
7 | 8 | from tortoise import Tortoise |
8 | 9 |
|
9 | 10 | from src.config import config |
| 11 | +from src.config.models import DbExtraApp, DbParams |
10 | 12 |
|
11 | 13 | logger = getLogger("bot").getChild("database") |
12 | 14 |
|
| 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 | + |
13 | 57 | TORTOISE_ORM = { |
14 | | - "connections": {"default": config.db.url}, |
| 58 | + "connections": connection_url_mapping, |
15 | 59 | "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], |
19 | 63 | } |
| 64 | + for app_name, app in config.db.extra_apps.items() |
20 | 65 | }, |
21 | 66 | } |
22 | 67 |
|
|
0 commit comments