first commit

This commit is contained in:
brusnitsyn
2026-03-08 20:21:15 +09:00
commit c201d36ae6
24 changed files with 3770 additions and 0 deletions

85
app/core/config.py Normal file
View File

@@ -0,0 +1,85 @@
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}'
class Config:
env_file = '.env'
case_sensitive = False
# Глобальный экземпляр настроек
settings = Settings()