Files
wifi-gps-mapper-public/reports/database.py
T
2026-10-06 21:08:12 +03:00

244 lines
4.8 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Работа с базой данных SQLite.
Данный модуль является единственной точкой доступа
к базе данных для HTML Report.
Никакие другие модули не должны напрямую вызывать
sqlite3.connect().
"""
import sqlite3
from pathlib import Path
from .config import DATABASE_FILE
# ============================================================
# Подключение
# ============================================================
def connect(database_file=None):
"""
Открыть соединение с SQLite.
"""
if database_file is None:
database_file = DATABASE_FILE
database_file = Path(database_file)
if not database_file.exists():
raise FileNotFoundError(
f"Database not found:\n{database_file}"
)
conn = sqlite3.connect(database_file)
conn.row_factory = sqlite3.Row
return conn
# ============================================================
# Выполнение SQL
# ============================================================
def execute(conn, sql, parameters=None):
"""
Выполнить SQL запрос.
"""
if parameters is None:
parameters = ()
cursor = conn.cursor()
cursor.execute(
sql,
parameters
)
return cursor
# ============================================================
# Один объект
# ============================================================
def query_one(conn, sql, parameters=None):
"""
Вернуть одну запись.
"""
cursor = execute(
conn,
sql,
parameters
)
return cursor.fetchone()
# ============================================================
# Все записи
# ============================================================
def query_all(conn, sql, parameters=None):
"""
Вернуть список записей.
"""
cursor = execute(
conn,
sql,
parameters
)
return cursor.fetchall()
# ============================================================
# Одно значение
# ============================================================
def query_value(conn, sql, parameters=None, default=None):
"""
Вернуть первое поле первой записи.
"""
row = query_one(
conn,
sql,
parameters
)
if row is None:
return default
if len(row) == 0:
return default
return row[0]
# ============================================================
# Проверка существования таблицы
# ============================================================
def table_exists(conn, table_name):
"""
Проверить существование таблицы.
"""
row = query_one(
conn,
"""
SELECT
name
FROM sqlite_master
WHERE type='table'
AND name=?
""",
(
table_name,
)
)
return row is not None
# ============================================================
# Количество строк
# ============================================================
def count_rows(conn, table_name):
"""
Вернуть количество строк таблицы.
"""
if not table_exists(
conn,
table_name
):
return 0
cursor = execute(
conn,
f"""
SELECT COUNT(*)
FROM {table_name}
"""
)
return cursor.fetchone()[0]
# ============================================================
# Список таблиц
# ============================================================
def list_tables(conn):
"""
Вернуть список таблиц базы.
"""
rows = query_all(
conn,
"""
SELECT
name
FROM sqlite_master
WHERE type='table'
ORDER BY name
"""
)
return [
row["name"]
for row in rows
]
# ============================================================
# Структура таблицы
# ============================================================
def table_info(conn, table_name):
"""
Вернуть описание таблицы.
"""
cursor = execute(
conn,
f"PRAGMA table_info({table_name})"
)
return cursor.fetchall()
# ============================================================
# Закрытие соединения
# ============================================================
def close(conn):
"""
Закрыть соединение.
"""
if conn is not None:
conn.close()