-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsql.py
More file actions
97 lines (78 loc) · 3.52 KB
/
sql.py
File metadata and controls
97 lines (78 loc) · 3.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import asyncio
import asyncpg
import json
import os
import ssl
import logging
# --- КОНФИГУРАЦИЯ (как в основном боте) ---
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
IMPORTANT_DIR = os.path.join(BASE_DIR, 'important')
CONFIG_PATH = os.path.join(IMPORTANT_DIR, 'config_task.json')
SSL_ROOT_CERT = os.path.join(IMPORTANT_DIR, 'root.crt')
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger("DB_Init")
async def create_tables():
# 1. Загружаем конфиг
try:
with open(CONFIG_PATH, 'r', encoding='utf-8') as f:
config = json.load(f)
db_conf = config.get("DATABASE")
if not db_conf:
raise ValueError("В конфиге нет секции DATABASE")
except Exception as e:
logger.error(f"Ошибка чтения конфига: {e}")
return
# 2. Настраиваем SSL (так же, как в боте)
ssl_ctx = ssl.create_default_context(cafile=SSL_ROOT_CERT)
ssl_ctx.check_hostname = False
ssl_ctx.verify_mode = ssl.CERT_REQUIRED
# 3. Формируем DSN
dsn = f"postgresql://{db_conf['USER']}:{db_conf['PASSWORD']}@{db_conf['HOST']}:{db_conf['PORT']}/{db_conf['DB_NAME']}"
logger.info("⏳ Подключение к базе данных...")
conn = None
try:
conn = await asyncpg.connect(dsn, ssl=ssl_ctx)
# 4. SQL скрипт создания таблицы
# IF NOT EXISTS гарантирует, что мы не затрем существующие данные
sql_create_tasks = """
CREATE TABLE IF NOT EXISTS tasks (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
username TEXT,
sender_info TEXT,
original_text TEXT,
task_title TEXT,
task_description TEXT,
is_completed BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
remind_at TIMESTAMP WITHOUT TIME ZONE,
reminder_sent BOOLEAN DEFAULT FALSE,
repeat_days INTEGER
);
CREATE TABLE IF NOT EXISTS user_settings (
user_id BIGINT PRIMARY KEY,
timezone_offset INTEGER DEFAULT 3
);
"""
# 5. Создание индексов (для ускорения работы бота)
sql_create_indexes = """
CREATE INDEX IF NOT EXISTS idx_tasks_remind_scheduler
ON tasks (remind_at, is_completed, reminder_sent);
CREATE INDEX IF NOT EXISTS idx_tasks_user_list
ON tasks (user_id, is_completed, created_at);
"""
logger.info("🛠 Создание таблицы tasks...")
await conn.execute(sql_create_tasks)
logger.info("⚡ Создание индексов...")
await conn.execute(sql_create_indexes)
logger.info("✅ Успешно! Таблицы готовы к работе.")
except Exception as e:
logger.error(f"❌ Ошибка при работе с БД: {e}")
finally:
if conn:
await conn.close()
logger.info("🔌 Соединение закрыто.")
if __name__ == "__main__":
if os.name == 'nt': # Для Windows (если вдруг запускаете локально)
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(create_tables())