139 lines
5.1 KiB
Python
139 lines
5.1 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Скрипт миграции для переноса записей из blacklist в blacklist_history.
|
||
Переносит все существующие записи из таблицы blacklist в таблицу blacklist_history.
|
||
"""
|
||
|
||
import argparse
|
||
import asyncio
|
||
import os
|
||
import sys
|
||
from datetime import datetime
|
||
from pathlib import Path
|
||
|
||
project_root = Path(__file__).resolve().parent.parent
|
||
sys.path.insert(0, str(project_root))
|
||
|
||
import aiosqlite
|
||
|
||
from logs.custom_logger import logger
|
||
|
||
DEFAULT_DB_PATH = "database/tg-bot-database.db"
|
||
|
||
|
||
async def main(db_path: str) -> None:
|
||
db_path = os.path.abspath(db_path)
|
||
if not os.path.exists(db_path):
|
||
logger.error("База данных не найдена: %s", db_path)
|
||
print(f"Ошибка: база данных не найдена: {db_path}")
|
||
return
|
||
|
||
async with aiosqlite.connect(db_path) as conn:
|
||
await conn.execute("PRAGMA foreign_keys = ON")
|
||
|
||
# Проверяем наличие таблицы blacklist_history
|
||
cursor = await conn.execute(
|
||
"SELECT name FROM sqlite_master WHERE type='table' AND name='blacklist_history'"
|
||
)
|
||
rows = await cursor.fetchall()
|
||
await cursor.close()
|
||
|
||
if not rows:
|
||
logger.error(
|
||
"Таблица blacklist_history не найдена. Сначала запустите create_blacklist_history_table.py"
|
||
)
|
||
print(
|
||
"Ошибка: таблица blacklist_history не найдена. Сначала запустите create_blacklist_history_table.py"
|
||
)
|
||
return
|
||
|
||
# Получаем все записи из blacklist
|
||
cursor = await conn.execute(
|
||
"SELECT user_id, message_for_user, date_to_unban, created_at, ban_author FROM blacklist"
|
||
)
|
||
blacklist_records = await cursor.fetchall()
|
||
await cursor.close()
|
||
|
||
if not blacklist_records:
|
||
print("В таблице blacklist нет записей для переноса.")
|
||
logger.info("В таблице blacklist нет записей для переноса")
|
||
return
|
||
|
||
logger.info(
|
||
"Найдено записей в blacklist для переноса: %d", len(blacklist_records)
|
||
)
|
||
print(f"Найдено записей в blacklist для переноса: {len(blacklist_records)}")
|
||
|
||
# Получаем текущее время в Unix timestamp
|
||
current_time = int(datetime.now().timestamp())
|
||
|
||
# Переносим записи в blacklist_history
|
||
migrated_count = 0
|
||
skipped_count = 0
|
||
|
||
for record in blacklist_records:
|
||
user_id, message_for_user, date_to_unban, created_at, ban_author = record
|
||
|
||
# Проверяем, нет ли уже записи для этого user_id с таким же date_ban
|
||
# (чтобы избежать дубликатов при повторном запуске)
|
||
date_ban = created_at if created_at is not None else current_time
|
||
|
||
check_cursor = await conn.execute(
|
||
"SELECT id FROM blacklist_history WHERE user_id = ? AND date_ban = ?",
|
||
(user_id, date_ban),
|
||
)
|
||
existing = await check_cursor.fetchone()
|
||
await check_cursor.close()
|
||
|
||
if existing:
|
||
logger.debug(
|
||
"Запись для user_id=%d с date_ban=%d уже существует, пропускаем",
|
||
user_id,
|
||
date_ban,
|
||
)
|
||
skipped_count += 1
|
||
continue
|
||
|
||
# Вставляем запись в blacklist_history
|
||
await conn.execute(
|
||
"""
|
||
INSERT INTO blacklist_history
|
||
(user_id, message_for_user, date_ban, date_unban, ban_author, created_at, updated_at)
|
||
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||
""",
|
||
(
|
||
user_id,
|
||
message_for_user,
|
||
date_ban,
|
||
date_to_unban,
|
||
ban_author,
|
||
created_at if created_at is not None else current_time,
|
||
current_time,
|
||
),
|
||
)
|
||
migrated_count += 1
|
||
|
||
await conn.commit()
|
||
|
||
logger.info(
|
||
"Миграция завершена. Перенесено записей: %d, пропущено (дубликаты): %d",
|
||
migrated_count,
|
||
skipped_count,
|
||
)
|
||
print(
|
||
f"Миграция завершена. Перенесено записей: {migrated_count}, пропущено (дубликаты): {skipped_count}"
|
||
)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
parser = argparse.ArgumentParser(
|
||
description="Перенос записей из blacklist в blacklist_history"
|
||
)
|
||
parser.add_argument(
|
||
"--db",
|
||
default=os.environ.get("DB_PATH", DEFAULT_DB_PATH),
|
||
help="Путь к БД (или DB_PATH)",
|
||
)
|
||
args = parser.parse_args()
|
||
asyncio.run(main(args.db))
|