#!/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()