import logging import os from typing import List, Literal, Optional, Dict from urllib.parse import quote_plus from pydantic_settings import BaseSettings from pydantic import Field from dotenv import load_dotenv load_dotenv() class Settings(BaseSettings): """Конфигурация приложения из переменных окружения""" # Настройки MSSQL MSSQL_SERVER: str = Field(..., env='MSSQL_SERVER') MSSQL_DATABASE: str = Field(..., env='MSSQL_DATABASE') MSSQL_USERNAME: str = Field(..., env='MSSQL_USERNAME') MSSQL_PASSWORD: str = Field(..., env='MSSQL_PASSWORD') MSSQL_DRIVER: str = 'pymssql' # Настройки PostgreSQL POSTGRES_HOST: str = Field(..., env='POSTGRES_HOST') POSTGRES_PORT: int = Field(5432, env='POSTGRES_PORT') POSTGRES_DATABASE: str = Field(..., env='POSTGRES_DATABASE') POSTGRES_USERNAME: str = Field(..., env='POSTGRES_USERNAME') POSTGRES_PASSWORD: str = Field(..., env='POSTGRES_PASSWORD') # Настройки email EMAIL_HOST: str = Field(..., env='EMAIL_HOST') EMAIL_PORT: int = Field(465, env='EMAIL_PORT') EMAIL_USER: str = Field(..., env='EMAIL_USER') EMAIL_PASSWORD: str = Field(..., env='EMAIL_PASSWORD') EMAIL_FROM: str = Field(..., env='EMAIL_FROM') EMAIL_TO: List[str] = Field(default_factory=lambda: ['andrew.brusnitsyn@gmail.com']) EMAIL_SUBJECT: str = 'Результат миграции данных MSSQL → PostgreSQL' # Настройки миграции CHUNK_SIZE: int = Field(1000, env='CHUNK_SIZE') BATCH_SIZE: int = Field(10, env='BATCH_SIZE') TABLES_TO_COPY: List[str] = Field( default_factory=lambda: ['oms_Department'] ) LIFE_TABLES: List[str] = Field( default_factory=lambda: ['oms_Department'] ) # Колонки дат для инкрементальной загрузки DEFAULT_DATE_COLUMNS: List[str] = Field( default_factory=lambda: [ 'DateExtract', 'DateDirection', 'DateRecipient', 'CreateDate', 'UpdateDate', 'ModifiedDate', 'ChangeDate', 'LastModified' ] ) # Файлы состояния LAST_REPLICATION_FILE: str = 'last_replication.json' LOG_DIR: str = 'logs' # Настройки API API_V1_PREFIX: str = '/api/v1' DEBUG: bool = Field(False, env='DEBUG') @property def MSSQL_CONNECTION_STRING(self) -> str: """Формирование строки подключения к MSSQL""" # Для pymssql с Windows аутентификацией используем формат: # mssql+pymssql://domain\\username:password@server:port/database # ИЛИ для trusted connection: # mssql+pymssql://username:password@server:port/database?charset=utf8 return rf'mssql+{self.MSSQL_DRIVER}://{self.MSSQL_USERNAME}:{self.MSSQL_PASSWORD}@{self.MSSQL_SERVER}/{self.MSSQL_DATABASE}' @property def POSTGRES_CONNECTION_STRING(self) -> str: """Формирование строки подключения к PostgreSQL""" return rf'postgresql://{self.POSTGRES_USERNAME}:{self.POSTGRES_PASSWORD}@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DATABASE}' @property def POSTGRES_ASYNC_CONNECTION_STRING(self) -> str: """Формирование строки подключения к PostgreSQL""" return rf'postgresql+asyncpg://{self.POSTGRES_USERNAME}:{self.POSTGRES_PASSWORD}@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DATABASE}' class Config: env_file = '.env' case_sensitive = False # Глобальный экземпляр настроек settings = Settings()