/
gr.ev.vl
/
TestGen
Обзор
Документация
Войти
/
gr.ev.vl
/
TestGen
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/setup_db1.cmd
663 строки
22 KB
gr.ev.vl
Initial commit
06 июн 2026, 02:41
06 июн 2026, 02:41
02fb1fb
Код
Авторство
О чём код?
@echo off chcp 1251 >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=E:\_GEV\_My_project\TestGen\" 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 �������� ������������ �� .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=1234" 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=1234" 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 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 �������� ����������� 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 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 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 PostgreSQL �������� (����� Python). goto :pg_available_done ) ) echo 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 �������� ������������ � ���� ������ PostgreSQL... if "%USE_PYTHON_FOR_DB%"=="1" ( call :pg_setup_python ) else ( call :pg_setup_psql ) ) else ( echo ������� ��������� PostgreSQL (����������). ) echo. rem ============================================================================= rem �������� � ��������� Redis rem ============================================================================= echo �������� ����������� 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 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 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 ����� Python � ������������ ���������... set "PYTHON=" if exist "%PROJECT_DIR%\.venv\Scripts\python.exe" ( set "PYTHON=%PROJECT_DIR%\.venv\Scripts\python.exe" echo ������� ����������� ���������: .venv ) if "%PYTHON%"=="" ( if exist "%BACKEND_DIR%\.venv\Scripts\python.exe" ( set "PYTHON=%BACKEND_DIR%\.venv\Scripts\python.exe" echo ������� ����������� ���������: 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 ������������ ��������� Python: !PYTHON! ) else ( echo Python �� ������. set "PYTHON_MISSING=1" ) ) else ( set "PYTHON_MISSING=0" ) echo. rem ============================================================================= rem ���������� �������� rem ============================================================================= echo ���������� �������� ���� ������... if "%PYTHON_MISSING%"=="1" ( echo ���������� ��������� ��������: 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 ������ ���������� ��������. echo ��������� ����������� PostgreSQL � ����� ������������. ) else ( echo �������� ��������� �������. ) :skip_migrations cd /d "%PROJECT_DIR%" echo. rem ============================================================================= rem ������� ����������������� ������� rem ============================================================================= echo ������� ����������������� ������... 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 ����������������� ������ ���������. ) else ( echo �� ������� �������� ������ ����� Python. ) cd /d "%PROJECT_DIR%" ) else ( echo �������: PostgreSQL ���������� ��� Python �� ������. ) echo. rem ============================================================================= rem �������� ����������������� rem ============================================================================= echo �������� �����������������... echo. if "%PYTHON_MISSING%"=="1" ( echo �������: 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 ����������������� ������. ) cd /d "%PROJECT_DIR%" ) else ( echo ���������. ) :skip_admin echo. rem ============================================================================= rem ���������� ��������� ������� rem ============================================================================= echo ���������� ��������� �������... echo. if "%PYTHON_MISSING%"=="1" ( echo �������: 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 �������� ������ ���������. ) cd /d "%PROJECT_DIR%" ) else ( echo ���������. ) :skip_seed echo. rem ============================================================================= rem �������� ��������� ��������� rem============================================================================= echo �������� ��������� ���������... 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 �������� �������� ���������� ��... 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 ��������� ����� ������� echo echo ����: %%BACKUP_FILE%% echo ^) else ( echo echo ������ �������� ��������� ����� echo ^) echo pause ) > "%SCRIPT_DIR%\backup_db.cmd" echo ������� �������: 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 ������������ ������. ) 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 ���� ������ %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 ���� ������ �������. ) ) 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 ������ �������� ���� ������. exit /b 1 ) echo ���� ������ �������. ) 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 ���������� ���������. 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 ����� ���������. 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