244 lines
4.8 KiB
Python
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() |