22from functools import lru_cache
33from pathlib import Path
44from typing import Any , Literal
5- from urllib .parse import quote_plus
65
76from pydantic import model_validator
87from pydantic_settings import BaseSettings , SettingsConfigDict
98
109from app .common .enums import EnvironmentEnum
10+ from app .config .db_url import build_redis_url , build_sqlalchemy_url
1111from app .config .path_conf import ENV_DIR
1212
1313
@@ -313,12 +313,13 @@ def _warn_insecure_cors(message: str) -> None:
313313 @property
314314 def REDIS_URI (self ) -> str :
315315 """构建 Redis 连接 URI(供 slowapi / 其他模块复用)。"""
316- auth_part = ""
317- if self .REDIS_USER and self .REDIS_PASSWORD :
318- auth_part = f"{ self .REDIS_USER } :{ self .REDIS_PASSWORD } @"
319- elif self .REDIS_PASSWORD :
320- auth_part = f":{ self .REDIS_PASSWORD } @"
321- return f"redis://{ auth_part } { self .REDIS_HOST } :{ self .REDIS_PORT } /{ self .REDIS_DB_NAME } "
316+ return build_redis_url (
317+ username = self .REDIS_USER ,
318+ password = self .REDIS_PASSWORD ,
319+ host = self .REDIS_HOST ,
320+ port = self .REDIS_PORT ,
321+ db = self .REDIS_DB_NAME ,
322+ )
322323
323324 @property
324325 def MIDDLEWARE_LIST (self ) -> list [str | None ]:
@@ -338,9 +339,24 @@ def ASYNC_DB_URI(self) -> str:
338339 raise ValueError (f"数据库驱动不支持: { self .DATABASE_TYPE } , 异步数据库请选择 mysql、postgres、sqlite" )
339340 db_connect : str = ""
340341 if self .DATABASE_TYPE == "mysql" :
341- db_connect = f"mysql+aiomysql://{ self .DATABASE_USER } :{ quote_plus (self .DATABASE_PASSWORD )} @{ self .DATABASE_HOST } :{ self .DATABASE_PORT } /{ self .DATABASE_NAME } ?charset=utf8mb4"
342+ db_connect = build_sqlalchemy_url (
343+ "mysql+aiomysql" ,
344+ username = self .DATABASE_USER ,
345+ password = self .DATABASE_PASSWORD ,
346+ host = self .DATABASE_HOST ,
347+ port = self .DATABASE_PORT ,
348+ database = self .DATABASE_NAME ,
349+ query = {"charset" : "utf8mb4" },
350+ )
342351 elif self .DATABASE_TYPE == "postgres" :
343- db_connect = f"postgresql+asyncpg://{ self .DATABASE_USER } :{ quote_plus (self .DATABASE_PASSWORD )} @{ self .DATABASE_HOST } :{ self .DATABASE_PORT } /{ self .DATABASE_NAME } "
352+ db_connect = build_sqlalchemy_url (
353+ "postgresql+asyncpg" ,
354+ username = self .DATABASE_USER ,
355+ password = self .DATABASE_PASSWORD ,
356+ host = self .DATABASE_HOST ,
357+ port = self .DATABASE_PORT ,
358+ database = self .DATABASE_NAME ,
359+ )
344360 else :
345361 name = self .DATABASE_NAME if self .DATABASE_NAME .endswith (".db" ) else f"{ self .DATABASE_NAME } .db"
346362 db_connect = f"sqlite+aiosqlite:///{ name } "
@@ -352,9 +368,24 @@ def DB_URI(self) -> str:
352368 raise ValueError (f"数据库驱动不支持: { self .DATABASE_TYPE } , 同步数据库请选择 mysql、postgres、sqlite" )
353369 db_connect : str = ""
354370 if self .DATABASE_TYPE == "mysql" :
355- db_connect = f"mysql+pymysql://{ self .DATABASE_USER } :{ quote_plus (self .DATABASE_PASSWORD )} @{ self .DATABASE_HOST } :{ self .DATABASE_PORT } /{ self .DATABASE_NAME } ?charset=utf8mb4"
371+ db_connect = build_sqlalchemy_url (
372+ "mysql+pymysql" ,
373+ username = self .DATABASE_USER ,
374+ password = self .DATABASE_PASSWORD ,
375+ host = self .DATABASE_HOST ,
376+ port = self .DATABASE_PORT ,
377+ database = self .DATABASE_NAME ,
378+ query = {"charset" : "utf8mb4" },
379+ )
356380 elif self .DATABASE_TYPE == "postgres" :
357- db_connect = f"postgresql+psycopg://{ self .DATABASE_USER } :{ quote_plus (self .DATABASE_PASSWORD )} @{ self .DATABASE_HOST } :{ self .DATABASE_PORT } /{ self .DATABASE_NAME } "
381+ db_connect = build_sqlalchemy_url (
382+ "postgresql+psycopg" ,
383+ username = self .DATABASE_USER ,
384+ password = self .DATABASE_PASSWORD ,
385+ host = self .DATABASE_HOST ,
386+ port = self .DATABASE_PORT ,
387+ database = self .DATABASE_NAME ,
388+ )
358389 else :
359390 name = self .DATABASE_NAME if self .DATABASE_NAME .endswith (".db" ) else f"{ self .DATABASE_NAME } .db"
360391 db_connect = f"sqlite:///{ name } "
@@ -379,7 +410,7 @@ def FASTAPI_CONFIG(self) -> dict[str, Any]:
379410 404 : {"description" : "资源不存在" },
380411 422 : {"description" : "请求参数验证错误" },
381412 500 : {"description" : "服务器内部错误" },
382- }
413+ },
383414 }
384415
385416
0 commit comments