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