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
def _init_schema(self):
# Основная схема (может упасть на индексах старых БД — ловим)
try:
self.conn.executescript("""
CREATE TABLE IF NOT EXISTS sessions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -79,7 +81,7 @@ class Database:
retry_count INTEGER DEFAULT 0,
timeout_count INTEGER DEFAULT 0,
script_mode TEXT,
transport TEXT, -- 'bt' | 'tcp'
transport TEXT,
mock_mode INTEGER DEFAULT 0,
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_vin ON sessions(vin);
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 (
mac TEXT PRIMARY KEY, -- BT MAC-адрес
level INTEGER NOT NULL, -- 0/1/2 (-1 = нерабочее)
elm_version TEXT, -- ATI ответ
elm_desc TEXT, -- AT@1 (если есть)
protocol TEXT, -- ATDPN
voltage TEXT, -- ATRV
supported TEXT, -- JSON: ["ATE0","ATL0",...]
unsupported TEXT, -- JSON: ["ATAT1",...]
errors TEXT, -- JSON: ["ATCFC1: no response",...]
mac TEXT PRIMARY KEY,
level INTEGER NOT NULL,
elm_version TEXT,
elm_desc TEXT,
protocol TEXT,
voltage TEXT,
supported TEXT,
unsupported TEXT,
errors TEXT,
first_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);
""")
except sqlite3.OperationalError:
pass # старая БД без новых колонок — применим миграции ниже
self.conn.commit()
# Миграции: добавляем колонки, которых нет в старых БД
@@ -138,7 +140,20 @@ class Database:
try:
self.conn.execute(sql)
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()
# ── sessions ──────────────────────────────────────────