Files
cursor_ai/example_postgresql.py

536 lines
19 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Примеры использования модуля postgresql через единый SSHClient.
Паттерн: SSHClient + connect() + операции + close()
"""
import config
from modules import SSHClient
def example_basic_usage():
"""
Пример базового использования модуля postgresql
"""
print("=" * 60)
print("Пример 1: Базовое использование модуля postgresql")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh']['host_keys'],
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
bases = client.bases_list(srv_pgsql)
print(f"Сервер PostgreSQL: {srv_pgsql}")
print(f"Найдено баз данных: {len(bases)}")
for base in bases[:5]: # Показываем первые 5
print(f" - {base}")
client.close()
print("\n")
def example_get_bases_list():
"""
Пример получения и вывода списка баз данных
"""
print("=" * 60)
print("Пример 2: Получение списка баз данных PostgreSQL")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
bases = client.bases_list(srv_pgsql)
print(f"Сервер: {srv_pgsql}")
print(f"Всего баз данных: {len(bases)}")
print("\nСписок баз данных:")
client.bases_list_print(srv_pgsql)
client.close()
print("\n")
def example_get_bases_size():
"""
Пример получения размеров баз данных
"""
print("=" * 60)
print("Пример 3: Получение размеров баз данных PostgreSQL")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
print(f"Сервер: {srv_pgsql}")
print("\nРазмеры баз данных:")
print("-" * 60)
print(f"{'База данных':<30} | Размер")
print("-" * 60)
client.bases_size_print(srv_pgsql)
client.close()
print("\n")
def example_backup_single_base():
"""
Пример создания бэкапа одной базы данных
"""
print("=" * 60)
print("Пример 4: Создание бэкапа одной базы данных")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
bases = client.bases_list(srv_pgsql)
if bases:
base_name = bases[0]
print(f"Создание бэкапа базы данных: {base_name}")
print(f"Сервер: {srv_pgsql}")
try:
results = client.bases_backup(srv_pgsql, base_name)
for result in results:
if result['success']:
print(f"✓ Бэкап базы '{result['base']}' создан успешно")
else:
print(f"✗ Ошибка при создании бэкапа '{result['base']}': {result['stderr']}")
except Exception as e:
print(f"Ошибка: {e}")
else:
print("Базы данных не найдены")
client.close()
print("\n")
def example_backup_multiple_bases():
"""
Пример создания бэкапа нескольких баз данных из списка в конфиге
"""
print("=" * 60)
print("Пример 5: Создание бэкапа нескольких баз данных")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
# Получаем список баз из конфигурации для примеров
bases_to_backup = cfg['migration'].get('bases', [])
if not bases_to_backup:
print("Список баз для бэкапа не указан в конфигурации (migration.bases)")
print("Используем все базы с сервера")
bases_to_backup = None
print(f"Сервер: {srv_pgsql}")
if bases_to_backup:
print(f"Базы для бэкапа: {', '.join(bases_to_backup)}")
else:
print("Бэкап всех баз данных")
try:
# Если указан список баз, создаем бэкап для каждой
if bases_to_backup:
for base_name in bases_to_backup:
print(f"\nСоздание бэкапа базы: {base_name}")
results = client.bases_backup(srv_pgsql, base_name)
for result in results:
if result['success']:
print(f" ✓ Бэкап базы '{result['base']}' создан успешно")
else:
print(f" ✗ Ошибка: {result['stderr']}")
else:
# Бэкап всех баз
results = client.bases_backup(srv_pgsql, None)
print(f"\nОбработано баз: {len(results)}")
successful = sum(1 for r in results if r['success'])
failed = len(results) - successful
print(f"Успешно: {successful}, Ошибок: {failed}")
for result in results:
if not result['success']:
print(f" ✗ Ошибка при бэкапе '{result['base']}': {result['stderr']}")
except Exception as e:
print(f"Ошибка: {e}")
client.close()
print("\n")
def example_backup_all_bases():
"""
Пример создания бэкапа всех баз данных
"""
print("=" * 60)
print("Пример 6: Создание бэкапа всех баз данных")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
print(f"Сервер: {srv_pgsql}")
print("Создание бэкапа всех баз данных...")
try:
result = client.bases_backup_all(srv_pgsql)
print("✓ Бэкап всех баз данных завершен успешно")
except Exception as e:
print(f"✗ Ошибка при создании бэкапа: {e}")
client.close()
print("\n")
def example_create_and_drop_base():
"""
Пример создания и удаления базы данных
"""
print("=" * 60)
print("Пример 7: Создание и удаление базы данных")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
srv_pgsql = cfg['postgresql']['restore_server']
test_base_name = "test_base_example"
print(f"Сервер: {srv_pgsql}")
print(f"Тестовая база: {test_base_name}")
try:
# Создаем базу данных
print("\n1. Создание базы данных...")
client.base_create(srv_pgsql, test_base_name)
print(f"✓ База данных '{test_base_name}' создана")
# Проверяем, что база создана
bases = client.bases_list(srv_pgsql)
if test_base_name in bases:
print(f"✓ База '{test_base_name}' найдена в списке баз")
# Удаляем базу данных
print("\n2. Удаление базы данных...")
client.base_drop(srv_pgsql, test_base_name)
print(f"✓ База данных '{test_base_name}' удалена")
# Проверяем, что база удалена
bases = client.bases_list(srv_pgsql)
if test_base_name not in bases:
print(f"✓ База '{test_base_name}' отсутствует в списке баз")
except Exception as e:
print(f"✗ Ошибка: {e}")
client.close()
print("\n")
def example_restore_base():
"""
Пример восстановления базы данных из бэкапа
"""
print("=" * 60)
print("Пример 8: Восстановление базы данных из бэкапа")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
archive_server = cfg['postgresql']['archive_server']
restore_server = cfg['postgresql']['restore_server']
backup_date = cfg['postgresql']['backup_date']
extra = cfg['postgresql']['extra_backup']
# Используем первую базу из списка миграции
archive_bases = cfg['migration']['archive_bases_name']
restore_bases = cfg['migration']['restore_bases_name']
if archive_bases and restore_bases:
for archive_base, restore_base in zip(archive_bases, restore_bases):
print(f"Восстановление базы данных:")
print(f" Архив: {archive_server}")
print(f" База в архиве: {archive_base}")
print(f" Сервер восстановления: {restore_server}")
print(f" База для восстановления: {restore_base}")
print(f" Дата бэкапа: {backup_date}")
print(f" Экстра-бэкап: {extra}")
try:
# Сначала удаляем старую базу, если существует
print(f"\n1. Удаление старой базы '{restore_base}' (если существует)...")
try:
client.base_drop(restore_server, restore_base)
print(f" ✓ Старая база удалена")
except Exception:
print(f" База не существует или уже удалена")
# Создаем новую базу
print(f"\n2. Создание новой базы '{restore_base}'...")
client.base_create(restore_server, restore_base)
print(f" ✓ База создана")
# Восстанавливаем из бэкапа
print(f"\n3. Восстановление из бэкапа...")
client.base_restore(
archive_server, restore_server, backup_date,
archive_base, restore_base, extra
)
print(f" ✓ База '{restore_base}' восстановлена успешно")
except Exception as e:
print(f" ✗ Ошибка при восстановлении: {e}")
client.close()
print("\n")
def example_manage_backups():
"""
Пример управления старыми бэкапами
"""
print("=" * 60)
print("Пример 9: Управление старыми бэкапами")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
backup_path = f'/backup/pgsql/{srv_pgsql}'
days_old = 30 # Удалять бэкапы старше 30 дней
print(f"Путь к бэкапам: {backup_path}")
print(f"Удаление бэкапов старше: {days_old} дней")
try:
# Получаем список старых директорий
print("\n1. Поиск старых бэкапов...")
old_dirs = client.file_list(backup_path, days_old)
if old_dirs.strip():
dirs_list = [d.strip() for d in old_dirs.split('\n') if d.strip()]
print(f"Найдено директорий для удаления: {len(dirs_list)}")
for d in dirs_list[:5]: # Показываем первые 5
print(f" - {d}")
else:
print("Старые бэкапы не найдены")
# Удаляем старые бэкапы
print(f"\n2. Удаление бэкапов старше {days_old} дней...")
client.delete_old_backups(backup_path, days_old)
print("✓ Удаление завершено")
except Exception as e:
print(f"✗ Ошибка: {e}")
client.close()
print("\n")
def example_full_workflow():
"""
Пример полного рабочего процесса: список -> размеры -> бэкап
"""
print("=" * 60)
print("Пример 10: Полный рабочий процесс")
print("=" * 60)
cfg = config.get_config()
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'),
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
try:
# Шаг 1: Получаем список баз
print("Шаг 1: Получение списка баз данных...")
bases = client.bases_list(srv_pgsql)
print(f" Найдено баз: {len(bases)}")
# Шаг 2: Получаем размеры баз
print("\nШаг 2: Получение размеров баз данных...")
sizes = client.bases_size(srv_pgsql)
print(f" Получены размеры для {len(sizes)} баз")
for size_info in sizes[:3]: # Показываем первые 3
base_name = size_info[0]
size = ''.join(size_info[1]) if size_info[1] else 'N/A'
print(f" {base_name}: {size}")
# Шаг 3: Создаем бэкап первой базы (если есть)
if bases:
print(f"\nШаг 3: Создание бэкапа базы '{bases[0]}'...")
results = client.bases_backup(srv_pgsql, bases[0])
for result in results:
if result['success']:
print(f" ✓ Бэкап создан успешно")
else:
print(f" ✗ Ошибка: {result['stderr']}")
except Exception as e:
print(f"Ошибка: {e}")
finally:
client.close()
print("\n")
def example_context_manager_style():
"""
Пример использования с обработкой ошибок
"""
print("=" * 60)
print("Пример 11: Использование с обработкой ошибок")
print("=" * 60)
cfg = config.get_config()
client = None
try:
client = SSHClient(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file']
)
client.connect()
srv_pgsql = cfg['postgresql']['archive_server']
# Получаем список баз и их размеры
bases = client.bases_list(srv_pgsql)
print(f"Сервер: {srv_pgsql}")
print(f"Найдено баз данных: {len(bases)}")
if bases:
print("\nПервые 5 баз данных:")
for base in bases[:5]:
print(f" - {base}")
except Exception as e:
print(f"Произошла ошибка: {e}")
finally:
if client:
client.close()
print("\nСоединение закрыто")
print("\n")
if __name__ == "__main__":
print("\n" + "=" * 60)
print("Примеры использования модуля postgresql.py")
print("=" * 60 + "\n")
# Раскомментируйте нужные примеры для запуска
# example_basic_usage()
example_get_bases_list()
# example_get_bases_size()
# example_backup_single_base()
# example_backup_multiple_bases()
# example_backup_all_bases()
# example_create_and_drop_base()
# example_restore_base()
# example_manage_backups()
# example_full_workflow()
# example_context_manager_style()
print("Для запуска примеров раскомментируйте соответствующие функции в конце файла")
print("\nПримеры демонстрируют:")
print(" 1. Базовое использование модуля")
print(" 2. Получение списка баз данных")
print(" 3. Получение размеров баз данных")
print(" 4. Создание бэкапа одной базы")
print(" 5. Создание бэкапа нескольких баз из конфига")
print(" 6. Создание бэкапа всех баз")
print(" 7. Создание и удаление базы данных")
print(" 8. Восстановление базы из бэкапа")
print(" 9. Управление старыми бэкапами")
print(" 10. Полный рабочий процесс")
print(" 11. Использование с обработкой ошибок")