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() |