Update public source
This commit is contained in:
@@ -0,0 +1,244 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user