From 7478b7176fa7884ad16cf93d18e3e24cd59ac719 Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Tue, 12 May 2026 09:35:03 +0800 Subject: [PATCH] feat: add YAML configuration module with pydantic-yaml - Created config directory with settings.py, __init__.py, and settings.yaml - Implemented SqlServerConfig and DatabaseConfig classes for SQL Server connections - Added Settings class with database_url property for SQLAlchemy URL construction - Uses parse_yaml_raw_as for UTF-8 safe YAML loading on Windows - Configuration validated successfully via import test Co-Authored-By: Claude Opus 4.6 (1M context) --- config/__init__.py | 3 +++ config/settings.py | 60 ++++++++++++++++++++++++++++++++++++++++++++ config/settings.yaml | 10 ++++++++ 3 files changed, 73 insertions(+) create mode 100644 config/__init__.py create mode 100644 config/settings.py create mode 100644 config/settings.yaml diff --git a/config/__init__.py b/config/__init__.py new file mode 100644 index 0000000..5f8f337 --- /dev/null +++ b/config/__init__.py @@ -0,0 +1,3 @@ +from config.settings import settings, Settings, load_settings + +__all__ = ["settings", "Settings", "load_settings"] diff --git a/config/settings.py b/config/settings.py new file mode 100644 index 0000000..71761ec --- /dev/null +++ b/config/settings.py @@ -0,0 +1,60 @@ +from pathlib import Path +from typing import Optional +from sqlalchemy.engine import URL +from pydantic import BaseModel, Field +from pydantic_yaml import parse_yaml_raw_as + + +class SqlServerConfig(BaseModel): + """SQL Server 连接配置""" + host: str + port: int = 1433 + database: str + username: str + password: str + driver: str = "{ODBC Driver 18 for SQL Server}" + trust_server_certificate: str = "yes" + + +class DatabaseConfig(BaseModel): + """数据库配置""" + sql_server: SqlServerConfig + + +class Settings(BaseModel): + """应用配置""" + database: DatabaseConfig + + @property + def database_url(self) -> URL: + """构建数据库连接 URL""" + conf = self.database.sql_server + return URL.create( + "mssql+pyodbc", + username=conf.username, + password=conf.password, + host=conf.host, + port=conf.port, + database=conf.database, + query={ + "driver": conf.driver.strip("{}"), + "TrustServerCertificate": conf.trust_server_certificate, + }, + ) + + +def load_settings(config_path: str = "config/settings.yaml") -> Settings: + """加载 YAML 配置文件""" + path = Path(config_path) + if not path.exists(): + raise FileNotFoundError( + f"配置文件不存在: {config_path}\n" + f"请确保文件存在于项目根目录或指定正确路径" + ) + # Use UTF-8 encoding to avoid Windows GBK encoding issues + with open(path, "r", encoding="utf-8") as f: + return parse_yaml_raw_as(Settings, f) + + +# 全局配置单例 +settings = load_settings() diff --git a/config/settings.yaml b/config/settings.yaml new file mode 100644 index 0000000..c2ac23b --- /dev/null +++ b/config/settings.yaml @@ -0,0 +1,10 @@ +# 数据库配置 +database: + sql_server: + host: 192.168.110.114 + port: 1433 + database: CompanyDB + username: peng + password: Cqbld123456. + driver: "{ODBC Driver 18 for SQL Server}" + trust_server_certificate: yes