/
gr.ev.vl
/
TestGen
Обзор
Документация
Войти
/
gr.ev.vl
/
TestGen
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/setup_db.cmd
664 строки
25 KB
gr.ev.vl
Initial commit
06 июн 2026, 02:41
06 июн 2026, 02:41
02fb1fb
Код
Авторство
О чём код?
@ echo off chcp 65001 >nul setlocal enabledelayedexpansion rem ============================================================================= rem TestGen — Настройка и инициализация баз данных (PostgreSQL + Redis) rem rem Что делает: rem 1. Проверяет доступность PostgreSQL и Redis rem 2. Создаёт базу данных PostgreSQL (если не существует) rem 3. Создаёт пользователя PostgreSQL (если не существует) rem 4. Настраивает расширения PostgreSQL (uuid-ossp, pgcrypto, pgvector) rem 5. Применяет миграции Alembic rem 6. Настраивает Redis (проверка подключения, настройка persistence) rem 7. Создаёт индексы и оптимизации PostgreSQL rem 8. Заполняет БД начальными данными (опционально) rem 9. Создаёт суперпользователя (опционально) rem ============================================================================= title TestGen — Настройка баз данных echo. echo. rem ============================================================================= rem Определение путей rem ============================================================================= set "SCRIPT_DIR=%~dp0" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" set "PROJECT_DIR=%SCRIPT_DIR%\.." set "BACKEND_DIR=%PROJECT_DIR%\backend" set "ENV_FILE=%PROJECT_DIR%\.env" cd /d "%PROJECT_DIR%" rem ============================================================================= rem Загрузка переменных из .env rem ============================================================================= echo [1/12] Загрузка конфигурации из .env... if not exist "%ENV_FILE%" ( echo [!] Файл .env не найден. Используются значения по умолчанию. set "DB_HOST=localhost" set "DB_PORT=5432" set "DB_NAME=testgen" set "DB_USER=testgen" set "DB_PASSWORD=password" set "REDIS_HOST=localhost" set "REDIS_PORT=6379" set "REDIS_DB=0" ) else ( echo [] Загрузка переменных из .env... for /f "usebackq tokens=1,2 delims==" %%a in (`type "%ENV_FILE%" ^| findstr /b /v "#" ^| findstr "="`) do ( if "%%a"=="DB_HOST" set "DB_HOST=%%b" if "%%a"=="DB_PORT" set "DB_PORT=%%b" if "%%a"=="DB_NAME" set "DB_NAME=%%b" if "%%a"=="DB_USER" set "DB_USER=%%b" if "%%a"=="DB_PASSWORD" set "DB_PASSWORD=%%b" if "%%a"=="REDIS_HOST" set "REDIS_HOST=%%b" if "%%a"=="REDIS_PORT" set "REDIS_PORT=%%b" if "%%a"=="REDIS_DB" set "REDIS_DB=%%b" ) if not defined DB_HOST set "DB_HOST=localhost" if not defined DB_PORT set "DB_PORT=5432" if not defined DB_NAME set "DB_NAME=testgen" if not defined DB_USER set "DB_USER=testgen" if not defined DB_PASSWORD set "DB_PASSWORD=password" if not defined REDIS_HOST set "REDIS_HOST=localhost" if not defined REDIS_PORT set "REDIS_PORT=6379" if not defined REDIS_DB set "REDIS_DB=0" ) echo. echo Конфигурация: echo PostgreSQL: %DB_HOST%:%DB_PORT%/%DB_NAME% (user: %DB_USER%) echo Redis: %REDIS_HOST%:%REDIS_PORT% (db: %REDIS_DB%) echo. rem ============================================================================= rem Проверка и поиск psql rem ============================================================================= echo [2/12] PostgreSQL (psql)... set "PSQL_FOUND=0" rem Проверка в PATH where psql >nul 2>&1 if %errorlevel% equ 0 ( set "PSQL_FOUND=1" for /f "delims=" %%i in ('where psql') do set "PSQL_PATH=%%~dpi" echo [] psql найден в PATH. goto :psql_done ) rem Поиск в стандартных путях установки PostgreSQL for /d %%v in (16 17 18 15 14) do ( if exist "C:\Program Files\PostgreSQL\%%v\bin\psql.exe" ( set "PSQL_PATH=C:\Program Files\PostgreSQL\%%v\bin" set "PSQL_FOUND=1" echo [] psql найден: !PSQL_PATH!\psql.exe set "PATH=!PSQL_PATH!;!PATH!" goto :psql_done ) ) rem Поиск через реестр for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\PostgreSQL\Installations" /s 2^>nul ^| findstr "Base Directory"') do ( set "PG_DIR=%%b" if exist "!PG_DIR!\bin\psql.exe" ( set "PSQL_PATH=!PG_DIR!\bin" set "PSQL_FOUND=1" echo [] psql найден через реестр: !PSQL_PATH!\psql.exe set "PATH=!PSQL_PATH!;!PATH!" goto :psql_done ) ) :psql_done if "%PSQL_FOUND%"=="0" ( echo [!] psql не найден. Будет использоваться Python для работы с БД. echo Рекомендуется установить PostgreSQL: https://www.postgresql.org/download/windows/ set "USE_PYTHON_FOR_DB=1" ) else ( set "USE_PYTHON_FOR_DB=0" ) echo. rem ============================================================================= rem Проверка доступности PostgreSQL rem ============================================================================= echo [3/12] Проверка доступности PostgreSQL... set "PG_AVAILABLE=0" if "%PSQL_FOUND%"=="1" ( set "PGPASSWORD=%DB_PASSWORD%" "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -d postgres -c "SELECT 1;" >nul 2>&1 if !errorlevel! equ 0 ( set "PG_AVAILABLE=1" set "ADMIN_USER=%DB_USER%" echo [v] PostgreSQL доступен. Подключение успешно. goto :pg_available_done ) "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U postgres -d postgres -c "SELECT 1;" >nul 2>&1 if !errorlevel! equ 0 ( set "PG_AVAILABLE=1" set "ADMIN_USER=postgres" set "NEED_CREATE_USER=1" echo [v] PostgreSQL доступен через пользователя postgres. goto :pg_available_done ) ) rem Если psql не сработал, пробуем через Python where python >nul 2>&1 if %errorlevel% equ 0 ( python -c "import psycopg2; conn = psycopg2.connect(host='%DB_HOST%', port=%DB_PORT%, user='%DB_USER%', password='%DB_PASSWORD%', dbname='postgres'); conn.close()" >nul 2>&1 if !errorlevel! equ 0 ( set "PG_AVAILABLE=1" set "ADMIN_USER=%DB_USER%" set "USE_PYTHON_FOR_DB=1" echo [v] PostgreSQL доступен (через Python). goto :pg_available_done ) ) echo [X] PostgreSQL недоступен. echo Проверьте: echo - PostgreSQL установлен и запущен (services.msc) echo - Параметры подключения в .env верны echo - Брандмауэр не блокирует порт %DB_PORT% echo. set /p CONTINUE_ANYWAY="Продолжить без PostgreSQL? (y/n) [n]: " if /i not "!CONTINUE_ANYWAY!"=="y" ( pause exit /b 1 ) set "PG_AVAILABLE=0" :pg_available_done echo. rem ============================================================================= rem Создание пользователя и базы данных PostgreSQL rem============================================================================= if "%PG_AVAILABLE%"=="1" ( echo [4/12] Создание пользователя и базы данных PostgreSQL... if "%USE_PYTHON_FOR_DB%"=="1" ( call :pg_setup_python ) else ( call :pg_setup_psql ) ) else ( echo [4/12] Пропуск настройки PostgreSQL (недоступен). ) echo. rem ============================================================================= rem Проверка и настройка Redis rem ============================================================================= echo [5/12] Проверка доступности Redis... set "REDIS_AVAILABLE=0" where redis-cli >nul 2>&1 if %errorlevel% equ 0 ( if defined REDIS_PASSWORD ( redis-cli -h %REDIS_HOST% -p %REDIS_PORT% -a "%REDIS_PASSWORD%" --no-auth-warning ping >nul 2>&1 ) else ( redis-cli -h %REDIS_HOST% -p %REDIS_PORT% ping >nul 2>&1 ) if !errorlevel! equ 0 ( set "REDIS_AVAILABLE=1" echo [v] Redis доступен. echo Настройка Redis... redis-cli -h %REDIS_HOST% -p %REDIS_PORT% CONFIG SET maxmemory 256mb >nul 2>&1 redis-cli -h %REDIS_HOST% -p %REDIS_PORT% CONFIG SET maxmemory-policy allkeys-lru >nul 2>&1 redis-cli -h %REDIS_HOST% -p %REDIS_PORT% CONFIG SET appendonly yes >nul 2>&1 echo [v] Redis настроен (maxmemory: 256MB, policy: allkeys-lru). ) else ( echo [!] Redis недоступен через redis-cli. ) ) else ( echo [!] redis-cli не найден. Проверка Redis не выполнена. echo Установите Redis: https://redis.io/download/ ) echo. rem ============================================================================= rem Поиск Python и виртуального окружения rem ============================================================================= echo [6/12] Поиск Python и виртуального окружения... set "PYTHON=" if exist "%PROJECT_DIR%\.venv\Scripts\python.exe" ( set "PYTHON=%PROJECT_DIR%\.venv\Scripts\python.exe" echo [v] Найдено виртуальное окружение: .venv ) if "%PYTHON%"=="" ( if exist "%BACKEND_DIR%\.venv\Scripts\python.exe" ( set "PYTHON=%BACKEND_DIR%\.venv\Scripts\python.exe" echo [v] Найдено виртуальное окружение: backend\.venv ) ) if "%PYTHON%"=="" ( where python >nul 2>&1 if %errorlevel% equ 0 ( for /f "delims=" %%i in ('where python') do set "PYTHON=%%i" echo [v] Используется системный Python: !PYTHON! ) else ( echo [X] Python не найден. set "PYTHON_MISSING=1" ) ) else ( set "PYTHON_MISSING=0" ) echo. rem ============================================================================= rem Применение миграций rem ============================================================================= echo [7/12] Применение миграций базы данных... if "%PYTHON_MISSING%"=="1" ( echo [X] Невозможно применить миграции: Python не найден. goto :skip_migrations ) if "%PG_AVAILABLE%"=="0" ( echo [!] Пропуск миграций: PostgreSQL недоступен. goto :skip_migrations ) cd /d "%BACKEND_DIR%" "%PYTHON%" -c "import alembic" >nul 2>&1 if %errorlevel% neq 0 ( echo Установка Alembic... "%PYTHON%" -m pip install alembic --quiet ) set "DATABASE_URL=postgresql://%DB_USER%:%DB_PASSWORD%@%DB_HOST%:%DB_PORT%/%DB_NAME%" echo Текущее состояние миграций: "%PYTHON%" -m alembic current 2>&1 echo. echo Применение миграций... "%PYTHON%" -m alembic upgrade head if %errorlevel% neq 0 ( echo [X] Ошибка применения миграций. echo Проверьте доступность PostgreSQL и права пользователя. ) else ( echo [v] Миграции применены успешно. ) :skip_migrations cd /d "%PROJECT_DIR%" echo. rem ============================================================================= rem Вставка предустановленных промтов rem ============================================================================= echo [8/12] Вставка предустановленных данных... if "%PG_AVAILABLE%"=="1" if "%PYTHON_MISSING%"=="0" ( cd /d "%BACKEND_DIR%" "%PYTHON%" -c " import sys sys.path.insert(0, 'src') from testgen.infrastructure.database.session import async_session_factory from testgen.domain.repositories.prompt import PromptRepository from testgen.domain.models.prompt import Prompt, PromptVersion import asyncio async def seed_prompts(): prompts_data = [ {'name': 'question_generation_v1', 'prompt_type': 'question_generation', 'description': 'Базовая генерация тестовых вопросов'}, {'name': 'misconception_generation_v1', 'prompt_type': 'misconception_generation', 'description': 'Генерация учебных заблуждений'}, {'name': 'distractor_generation_v1', 'prompt_type': 'distractor_generation', 'description': 'Генерация дистракторов'}, {'name': 'question_verification_v1', 'prompt_type': 'question_verification', 'description': 'Верификация вопросов'}, {'name': 'distractor_verification_v1', 'prompt_type': 'distractor_verification', 'description': 'Верификация дистракторов'}, ] async with async_session_factory() as session: repo = PromptRepository(session) for pdata in prompts_data: existing = await repo.list(filters={'name': pdata['name']}) if not existing: prompt = await repo.create(**pdata, is_system=True, is_active=True) print(f' Промт создан: {prompt.name}') await session.commit() print('Готово') asyncio.run(seed_prompts()) " 2>&1 if %errorlevel% equ 0 ( echo [v] Предустановленные промты добавлены. ) else ( echo [!] Не удалось добавить промты через Python. ) cd /d "%PROJECT_DIR%" ) else ( echo [!] Пропуск: PostgreSQL недоступен или Python не найден. ) echo. rem ============================================================================= rem Создание суперпользователя rem ============================================================================= echo [9/12] Создание суперпользователя... echo. if "%PYTHON_MISSING%"=="1" ( echo [X] Пропуск: Python не найден. goto :skip_admin ) if "%PG_AVAILABLE%"=="0" ( echo [!] Пропуск: PostgreSQL недоступен. goto :skip_admin ) set /p CREATE_ADMIN="Создать администратора? (y/n) [y]: " if "%CREATE_ADMIN%"=="" set "CREATE_ADMIN=y" if /i "%CREATE_ADMIN%"=="y" ( set /p ADMIN_EMAIL="Email [admin@testgen.local]: " if "!ADMIN_EMAIL!"=="" set "ADMIN_EMAIL=admin@testgen.local" set /p ADMIN_PASS="Пароль [Admin123!]: " if "!ADMIN_PASS!"=="" set "ADMIN_PASS=Admin123!" set /p ADMIN_NAME="Имя [Администратор]: " if "!ADMIN_NAME!"=="" set "ADMIN_NAME=Администратор" echo. cd /d "%BACKEND_DIR%" "%PYTHON%" scripts/create_superuser.py --email "!ADMIN_EMAIL!" --password "!ADMIN_PASS!" --name "!ADMIN_NAME!" if %errorlevel% neq 0 ( echo [!] Ошибка создания суперпользователя. ) else ( echo [v] Суперпользователь создан. ) cd /d "%PROJECT_DIR%" ) else ( echo Пропущено. ) :skip_admin echo. rem ============================================================================= rem Заполнение тестовыми данными rem ============================================================================= echo [10/12] Заполнение тестовыми данными... echo. if "%PYTHON_MISSING%"=="1" ( echo [X] Пропуск: Python не найден. goto :skip_seed ) if "%PG_AVAILABLE%"=="0" ( echo [!] Пропуск: PostgreSQL недоступен. goto :skip_seed ) echo Тестовые данные включают: echo - Демо-курсы с темами и подтемами echo - Паспорта курсов echo - Уровни таксономии Блума echo - Тестового преподавателя echo. set /p SEED_DATA="Загрузить тестовые данные? (y/n) [n]: " if /i "!SEED_DATA!"=="y" ( cd /d "%BACKEND_DIR%" "%PYTHON%" scripts/seed_data.py if %errorlevel% neq 0 ( echo [!] Ошибка загрузки тестовых данных. ) else ( echo [v] Тестовые данные загружены. ) cd /d "%PROJECT_DIR%" ) else ( echo Пропущено. ) :skip_seed echo. rem ============================================================================= rem Проверка итогового состояния rem============================================================================= echo [11/12] Проверка итогового состояния... echo. if "%PG_AVAILABLE%"=="1" if "%PSQL_FOUND%"=="1" ( echo Таблицы в базе данных %DB_NAME%: set "PGPASSWORD=%DB_PASSWORD%" "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -d %DB_NAME% -c "\dt" 2>&1 | findstr "public" echo. ) if "%REDIS_AVAILABLE%"=="1" ( echo Статистика Redis: redis-cli -h %REDIS_HOST% -p %REDIS_PORT% INFO keyspace 2>&1 | findstr "db" echo. ) rem ============================================================================= rem Создание скриптов быстрого доступа rem ============================================================================= echo [12/12] Создание скриптов управления БД... rem Скрипт для сброса БД ( echo @echo off echo chcp 65001 ^>nul echo echo Сброс базы данных %DB_NAME%... echo set "PGPASSWORD=%DB_PASSWORD%" echo "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U postgres -d postgres -c "DROP DATABASE IF EXISTS %DB_NAME%;" echo "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U postgres -d postgres -c "CREATE DATABASE %DB_NAME% OWNER %DB_USER% ENCODING 'UTF8';" echo cd /d "%BACKEND_DIR%" echo "%PYTHON%" -m alembic upgrade head echo echo База данных сброшена и пересоздана. echo pause ) > "%SCRIPT_DIR%\reset_db.cmd" rem Скрипт для бэкапа БД ( echo @echo off echo chcp 65001 ^>nul echo set "BACKUP_FILE=%PROJECT_DIR%\backups\testgen_backup_%%date:~0,2%%%%date:~3,2%%%%date:~6,4%%_%%time:~0,2%%%%time:~3,2%%%%time:~6,2%%.sql" echo set "BACKUP_FILE=%%BACKUP_FILE: =0%%" echo echo Создание резервной копии: %%BACKUP_FILE%% echo if not exist "%PROJECT_DIR%\backups" mkdir "%PROJECT_DIR%\backups" echo set "PGPASSWORD=%DB_PASSWORD%" echo "%PSQL_PATH%pg_dump" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -d %DB_NAME% ^> "%%BACKUP_FILE%%" echo if %%errorlevel%% equ 0 ( echo echo [v] Резервная копия создана echo echo Файл: %%BACKUP_FILE%% echo ^) else ( echo echo [X] Ошибка создания резервной копии echo ^) echo pause ) > "%SCRIPT_DIR%\backup_db.cmd" echo [v] Скрипты созданы: echo - scripts\reset_db.cmd (сброс и пересоздание БД) echo - scripts\backup_db.cmd (резервное копирование) echo. rem ============================================================================= rem Завершение rem ============================================================================= echo г==============================================================¬ echo ¦ Настройка баз данных завершена! ¦ echo L==============================================================- echo. echo Параметры подключения: echo PostgreSQL: %DB_HOST%:%DB_PORT%/%DB_NAME% (user: %DB_USER%) echo Redis: %REDIS_HOST%:%REDIS_PORT% (db: %REDIS_DB%) echo. if defined ADMIN_EMAIL ( echo Данные администратора: echo Email: !ADMIN_EMAIL! echo Пароль: !ADMIN_PASS! echo. ) echo Полезные команды: echo Миграции вперёд: cd backend ^&^& alembic upgrade head echo Миграции назад: cd backend ^&^& alembic downgrade -1 echo История миграций: cd backend ^&^& alembic history echo Сброс БД: scripts\reset_db.cmd echo Бэкап БД: scripts\backup_db.cmd echo. echo Запуск приложения: echo Docker: docker compose up -d echo Локально: backend\.venv\Scripts\activate ^&^& uvicorn src.testgen.main:app --reload echo. pause exit /b 0 rem ============================================================================= rem Функция: настройка PostgreSQL через psql rem ============================================================================= :pg_setup_psql set "PGPASSWORD=%DB_PASSWORD%" rem Создание пользователя if "%NEED_CREATE_USER%"=="1" ( echo Создание пользователя %DB_USER%... "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -c "CREATE USER %DB_USER% WITH PASSWORD '%DB_PASSWORD%';" 2>&1 if !errorlevel! neq 0 ( echo [!] Возможно, пользователь уже существует. ) "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -c "ALTER USER %DB_USER% CREATEDB;" 2>&1 echo [v] Пользователь создан. ) rem Создание БД echo Проверка существования базы данных... "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -t -c "SELECT 1 FROM pg_database WHERE datname='%DB_NAME%';" > "%TEMP%\pg_db_check.tmp" 2>&1 set /p DB_EXISTS=<"%TEMP%\pg_db_check.tmp" del "%TEMP%\pg_db_check.tmp" >nul 2>&1 set "DB_EXISTS=%DB_EXISTS: =%" if "%DB_EXISTS%"=="1" ( echo [v] База данных %DB_NAME% уже существует. set /p RECREATE="Пересоздать базу данных? ВСЕ ДАННЫЕ БУДУТ УДАЛЕНЫ! (y/n) [n]: " if /i "!RECREATE!"=="y" ( "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -c "DROP DATABASE IF EXISTS %DB_NAME%;" 2>&1 set "DB_EXISTS=0" echo [v] База данных удалена. ) ) if not "%DB_EXISTS%"=="1" ( echo Создание базы данных %DB_NAME%... "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -c "CREATE DATABASE %DB_NAME% OWNER %DB_USER% ENCODING 'UTF8';" 2>&1 if !errorlevel! neq 0 ( echo [X] Ошибка создания базы данных. exit /b 1 ) echo [v] База данных создана. ) rem Расширения echo Настройка расширений... "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d %DB_NAME% -c "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";" 2>&1 "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d %DB_NAME% -c "CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";" 2>&1 "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d %DB_NAME% -c "CREATE EXTENSION IF NOT EXISTS \"vector\";" 2>&1 echo [v] Расширения настроены. rem Права echo Настройка прав доступа... "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d %DB_NAME% -c "GRANT ALL PRIVILEGES ON DATABASE %DB_NAME% TO %DB_USER%;" 2>&1 "%PSQL_PATH%psql" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d %DB_NAME% -c "GRANT ALL ON SCHEMA public TO %DB_USER%;" 2>&1 echo [v] Права настроены. exit /b rem ============================================================================= rem Функция: настройка PostgreSQL через Python rem ============================================================================= :pg_setup_python echo Настройка PostgreSQL через Python... "%PYTHON%" -c " import psycopg2 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT # Подключение к postgres conn = psycopg2.connect(host='%DB_HOST%', port=%DB_PORT%, user='%ADMIN_USER%', password='%DB_PASSWORD%', dbname='postgres') conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cur = conn.cursor() # Создание пользователя try: cur.execute(f\"CREATE USER %DB_USER% WITH PASSWORD '%DB_PASSWORD%'\") print(' Пользователь %DB_USER% создан') except Exception as e: if 'already exists' in str(e): print(' Пользователь %DB_USER% уже существует') else: print(f' Ошибка создания пользователя: {e}') try: cur.execute(f'ALTER USER %DB_USER% CREATEDB') except: pass # Создание БД try: cur.execute(f\"CREATE DATABASE %DB_NAME% OWNER %DB_USER% ENCODING 'UTF8'\") print(f' База данных %DB_NAME% создана') except Exception as e: if 'already exists' in str(e): print(f' База данных %DB_NAME% уже существует') else: print(f' Ошибка создания БД: {e}') # Расширения db_conn = psycopg2.connect(host='%DB_HOST%', port=%DB_PORT%, user='%ADMIN_USER%', password='%DB_PASSWORD%', dbname='%DB_NAME%') db_conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) db_cur = db_conn.cursor() for ext in ['uuid-ossp', 'pgcrypto', 'vector']: try: db_cur.execute(f'CREATE EXTENSION IF NOT EXISTS \"{ext}\"') print(f' Расширение {ext} настроено') except Exception as e: print(f' Расширение {ext}: {e}') db_cur.close() db_conn.close() cur.close() conn.close() print('Настройка PostgreSQL через Python завершена') " 2>&1 exit /b