fix(db): executescript в try/except, индексы отдельно от миграций
This commit is contained in:
@@ -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 ──────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user