From 7e25cd66741ba3c227bf52d14395840694f14c58 Mon Sep 17 00:00:00 2001 From: shahzeydyfah Date: Tue, 17 Feb 2026 22:33:24 +0330 Subject: [PATCH] feat(root):add mysql --- config.yml | 15 +++++++++++++++ core/config.py | 42 ++++++++++++++++++++++++++++++++++++++---- requirements.txt | 2 ++ 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/config.yml b/config.yml index 157d13c..77b555a 100644 --- a/config.yml +++ b/config.yml @@ -81,3 +81,18 @@ database: version: 4 password: 'sample' user: 'local' + +# MySQL (read-only) - جدا از database تا مونگو و بقیه بدون تغییر بمانند +mysql: + dev: + host: '172.16.1.194' + port: 3309 + user: 'root' + password: '2TjwtsnYAs' + db: 'doc' + production: + host: '172.16.1.194' + port: 3309 + user: 'root' + password: '2TjwtsnYAs' + db: 'doc' diff --git a/core/config.py b/core/config.py index 8536ce8..1a4ac6c 100644 --- a/core/config.py +++ b/core/config.py @@ -1,10 +1,10 @@ import os from pathlib import Path -from typing import Optional, List, Union +from typing import Optional, List, Union, Dict, Any import pydantic import yaml -from pydantic import BaseModel +from pydantic import BaseModel, validator def build_path(path: Union[Path, str], path_is_absolute: bool = False) -> Path: @@ -73,6 +73,19 @@ class DatabaseModeConfig(BaseModel): production: Optional[DatabaseConfig] +class MySQLConfig(BaseModel): + host: str + port: int + user: str + password: str + db: str + + +class MySQLModeConfig(BaseModel): + dev: Optional[MySQLConfig] + production: Optional[MySQLConfig] + + class DependencyConfig(BaseModel): middleware: Optional[List[str]] routes: Optional[List[str]] @@ -115,12 +128,33 @@ class CoreConfig(pydantic.BaseModel): server: Optional[ServerConfig] auth: Optional[AuthConfig] dependency: Optional[DependencyConfig] - database: dict[str, Union[DatabaseConfig, DatabaseModeConfig]] + database: Dict[str, Union[DatabaseConfig, DatabaseModeConfig]] + mysql: Optional[MySQLModeConfig] = None static_files: dict[str, str] = dict() celery: Optional[CeleryTask] + @validator('database', pre=True) + def parse_database(cls, v: Any) -> Dict[str, Union[DatabaseConfig, DatabaseModeConfig]]: + if not isinstance(v, dict): + return v + result: Dict[str, Union[DatabaseConfig, DatabaseModeConfig]] = {} + for key, val in v.items(): + if not isinstance(val, dict): + result[key] = val + continue + if 'dev' in val or 'production' in val: + dev = val.get('dev') + prod = val.get('production') + result[key] = DatabaseModeConfig( + dev=DatabaseConfig(**(dev or {})) if dev else None, + production=DatabaseConfig(**(prod or {})) if prod else None, + ) + else: + result[key] = DatabaseConfig(**val) + return result + class Config: - arbitrary_types_allowed = False + arbitrary_types_allowed = True # def load_modules_config(self): # # import dynamic routes in the modules diff --git a/requirements.txt b/requirements.txt index 4b7cd5c..f814abf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,7 @@ aiofiles==22.1.0 +aiomysql==0.2.0 aioredis==2.0.1 +asyncmy==0.2.9 amqp==5.1.1 annotated-types==0.6.0 anyio==3.6.2