90 lines
3.7 KiB
Python
90 lines
3.7 KiB
Python
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() |