88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
|
# database.py
|
|
|
|
import sqlite3
|
|
from config import DB_FILE
|
|
|
|
def get_db_connection():
|
|
"""Создаёт соединение с БД"""
|
|
conn = sqlite3.connect(DB_FILE, check_same_thread=False)
|
|
conn.row_factory = sqlite3.Row
|
|
return conn
|
|
|
|
def init_db():
|
|
"""Инициализация базы данных"""
|
|
conn = get_db_connection()
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY,
|
|
tz TEXT,
|
|
gender TEXT,
|
|
name TEXT,
|
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
)''')
|
|
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS pills (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER,
|
|
name TEXT,
|
|
dose TEXT,
|
|
interval_days INTEGER DEFAULT 1,
|
|
weekdays TEXT DEFAULT NULL,
|
|
course_days INTEGER DEFAULT 0,
|
|
start_date TEXT,
|
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
)''')
|
|
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS pill_times (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
pill_id INTEGER,
|
|
time TEXT,
|
|
last_sent TEXT DEFAULT NULL,
|
|
last_confirmed TEXT DEFAULT NULL,
|
|
FOREIGN KEY (pill_id) REFERENCES pills(id) ON DELETE CASCADE
|
|
)''')
|
|
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
gender TEXT,
|
|
text_message TEXT,
|
|
sticker_id TEXT
|
|
)''')
|
|
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS history (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
pill_id INTEGER,
|
|
user_id INTEGER,
|
|
ts TEXT,
|
|
taken INTEGER,
|
|
FOREIGN KEY (pill_id) REFERENCES pills(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
)''')
|
|
|
|
# Индексы
|
|
cursor.execute('CREATE INDEX IF NOT EXISTS idx_pills_user_id ON pills(user_id)')
|
|
cursor.execute('CREATE INDEX IF NOT EXISTS idx_pill_times_pill_id ON pill_times(pill_id)')
|
|
cursor.execute('CREATE INDEX IF NOT EXISTS idx_history_user_pill ON history(user_id, pill_id)')
|
|
cursor.execute('CREATE INDEX IF NOT EXISTS idx_history_ts ON history(ts)')
|
|
|
|
# Default messages
|
|
cursor.execute("SELECT COUNT(*) FROM messages")
|
|
if cursor.fetchone()[0] == 0:
|
|
msg_rows = [
|
|
("Я мужчина", "Пора принять {pill} ({dose}).", None),
|
|
("Я мужчина", "Напоминание: {pill} — {dose}.", None),
|
|
("Я женщина", "Пора принять {pill} ({dose}).", None),
|
|
("Я женщина", "Напоминание: {pill} — {dose}.", None),
|
|
]
|
|
cursor.executemany("INSERT INTO messages (gender, text_message, sticker_id) VALUES (?, ?, ?)", msg_rows)
|
|
|
|
conn.commit()
|
|
conn.close() |