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:
3
config/__init__.py
Normal file
3
config/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from config.settings import settings, Settings, load_settings
|
||||||
|
|
||||||
|
__all__ = ["settings", "Settings", "load_settings"]
|
||||||
60
config/settings.py
Normal file
60
config/settings.py
Normal 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
10
config/settings.yaml
Normal 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
|
||||||
Reference in New Issue
Block a user