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) <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-05-12 09:35:03 +08:00
parent 33fee72e3f
commit 7478b7176f
3 changed files with 73 additions and 0 deletions

3
config/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
from config.settings import settings, Settings, load_settings
__all__ = ["settings", "Settings", "load_settings"]

60
config/settings.py Normal file
View File

@@ -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()

10
config/settings.yaml Normal file
View File

@@ -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