fix(db): executescript в try/except, индексы отдельно от миграций

This commit is contained in:
Repinoid
2026-06-07 09:16:33 +04:00
parent d5e44060d3
commit fd2126c0cb
+30 -15
View File
@@ -39,6 +39,8 @@ class Database:
self.conn = None self.conn = None
def _init_schema(self): def _init_schema(self):
# Основная схема (может упасть на индексах старых БД — ловим)
try:
self.conn.executescript(""" self.conn.executescript("""
CREATE TABLE IF NOT EXISTS sessions ( CREATE TABLE IF NOT EXISTS sessions (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -79,7 +81,7 @@ class Database:
retry_count INTEGER DEFAULT 0, retry_count INTEGER DEFAULT 0,
timeout_count INTEGER DEFAULT 0, timeout_count INTEGER DEFAULT 0,
script_mode TEXT, script_mode TEXT,
transport TEXT, -- 'bt' | 'tcp' transport TEXT,
mock_mode INTEGER DEFAULT 0, mock_mode INTEGER DEFAULT 0,
car_info TEXT, car_info TEXT,
@@ -101,26 +103,26 @@ class Database:
CREATE INDEX IF NOT EXISTS idx_sessions_created ON sessions(created_at); CREATE INDEX IF NOT EXISTS idx_sessions_created ON sessions(created_at);
CREATE INDEX IF NOT EXISTS idx_sessions_vin ON sessions(vin); CREATE INDEX IF NOT EXISTS idx_sessions_vin ON sessions(vin);
CREATE INDEX IF NOT EXISTS idx_sessions_mac ON sessions(elm_mac); CREATE INDEX IF NOT EXISTS idx_sessions_mac ON sessions(elm_mac);
CREATE INDEX IF NOT EXISTS idx_sessions_aid ON sessions(android_id);
CREATE INDEX IF NOT EXISTS idx_sessions_request_id ON sessions(request_id);
CREATE INDEX IF NOT EXISTS idx_sessions_uuid ON sessions(device_uuid);
-- Профили ELM-устройств (по BT MAC) -- Профили ELM-устройств
CREATE TABLE IF NOT EXISTS device_profiles ( CREATE TABLE IF NOT EXISTS device_profiles (
mac TEXT PRIMARY KEY, -- BT MAC-адрес mac TEXT PRIMARY KEY,
level INTEGER NOT NULL, -- 0/1/2 (-1 = нерабочее) level INTEGER NOT NULL,
elm_version TEXT, -- ATI ответ elm_version TEXT,
elm_desc TEXT, -- AT@1 (если есть) elm_desc TEXT,
protocol TEXT, -- ATDPN protocol TEXT,
voltage TEXT, -- ATRV voltage TEXT,
supported TEXT, -- JSON: ["ATE0","ATL0",...] supported TEXT,
unsupported TEXT, -- JSON: ["ATAT1",...] unsupported TEXT,
errors TEXT, -- JSON: ["ATCFC1: no response",...] errors TEXT,
first_seen TEXT NOT NULL DEFAULT (datetime('now')), first_seen TEXT NOT NULL DEFAULT (datetime('now')),
last_seen TEXT NOT NULL DEFAULT (datetime('now')) last_seen TEXT NOT NULL DEFAULT (datetime('now'))
); );
CREATE INDEX IF NOT EXISTS idx_profiles_level ON device_profiles(level); CREATE INDEX IF NOT EXISTS idx_profiles_level ON device_profiles(level);
""") """)
except sqlite3.OperationalError:
pass # старая БД без новых колонок — применим миграции ниже
self.conn.commit() self.conn.commit()
# Миграции: добавляем колонки, которых нет в старых БД # Миграции: добавляем колонки, которых нет в старых БД
@@ -138,7 +140,20 @@ class Database:
try: try:
self.conn.execute(sql) self.conn.execute(sql)
except sqlite3.OperationalError: except sqlite3.OperationalError:
pass # колонка уже существует pass
# Индексы для новых колонок (могут отсутствовать в старых БД)
index_migrations = [
"CREATE INDEX IF NOT EXISTS idx_sessions_aid ON sessions(android_id)",
"CREATE INDEX IF NOT EXISTS idx_sessions_uuid ON sessions(device_uuid)",
"CREATE INDEX IF NOT EXISTS idx_sessions_request_id ON sessions(request_id)",
]
for sql in index_migrations:
try:
self.conn.execute(sql)
except sqlite3.OperationalError:
pass
self.conn.commit() self.conn.commit()
# ── sessions ────────────────────────────────────────── # ── sessions ──────────────────────────────────────────