import sqlite3 import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DB_PATH = os.path.join(BASE_DIR, "database.db") def get_connection(): """Открывает соединение с БД.""" conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row # доступ к колонкам по имени conn.execute("PRAGMA foreign_keys = ON") return conn def init_db(): """Создаёт таблицы при первом запуске.""" conn = get_connection() cur = conn.cursor() cur.execute(""" CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, salt TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now')) ) """) cur.execute(""" CREATE TABLE IF NOT EXISTS sessions ( token TEXT PRIMARY KEY, user_id INTEGER NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now')), expires_at TEXT NOT NULL, FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ) """) # status — текстовое состояние ("on"/"off"/"error" и т.д.) # value — произвольный числовой параметр объекта cur.execute(""" CREATE TABLE IF NOT EXISTS objects ( id INTEGER PRIMARY KEY AUTOINCREMENT, owner_id INTEGER NOT NULL, name TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'off', value REAL NOT NULL DEFAULT 0, updated_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (owner_id) REFERENCES users (id) ON DELETE CASCADE ) """) # source: 'user' — команда из кабинета, 'external' — данные от внешней системы cur.execute(""" CREATE TABLE IF NOT EXISTS command_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, object_id INTEGER NOT NULL, source TEXT NOT NULL, status TEXT NOT NULL, value REAL NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now')), FOREIGN KEY (object_id) REFERENCES objects (id) ON DELETE CASCADE ) """) # миграция: поля профиля пилота (для существующих БД) cur.execute("PRAGMA table_info(users)") existing_cols = {row[1] for row in cur.fetchall()} profile_cols = { "full_name": "TEXT", "birth_date": "TEXT", "phone": "TEXT", "gender": "TEXT", } for col, col_type in profile_cols.items(): if col not in existing_cols: cur.execute(f"ALTER TABLE users ADD COLUMN {col} {col_type}") conn.commit() conn.close()