Source code for sosia.establishing.database
"""This module provides functions for connecting to and creating a SQLite database."""
import sqlite3
from pathlib import Path
from typing import Optional
from numpy import int32, int64
from sosia.utils import custom_print
def connect_database(fname: Path, verbose) -> sqlite3.Connection:
"""Connect to local SQLite3 database to be used as cache.
Parameters
----------
fname : pathlib.Path
The path of the SQLite3 database to connect to.
verbose : bool (optional, default=False)
Whether to report on the status of the database.
"""
for val in (int32, int64):
sqlite3.register_adapter(val, int)
if not fname.exists():
make_database(fname, verbose=verbose)
text = f"Connection to local database '{fname}' established"
custom_print(text, verbose)
return sqlite3.connect(fname)
[docs]
def make_database(
fname: Optional[Path] = None,
verbose: bool = False,
drop: bool = False
) -> None:
"""Make SQLite database with predefined tables and keys.
Parameters
----------
fname : pathlib.Path (optional, default=None)
The path of the SQLite database to connect to. If None, will default
to `~/.cache/sosia/main.sqlite`.
verbose : boolean (optional, default=False)
Whether to report on the progess of the process.
drop : boolean (optional, default=False)
If True, deletes and recreates all tables in cache (irreversible).
"""
from sosia.establishing.constants import DB_TABLES, DEFAULT_DATABASE
if not fname:
fname = DEFAULT_DATABASE
# Create database
existed = fname.exists()
fname.parent.mkdir(parents=True, exist_ok=True)
conn = sqlite3.connect(fname)
# Create tables
cursor = conn.cursor()
for table, variables in DB_TABLES.items():
if drop:
cursor.execute(f"DROP TABLE IF EXISTS {table}")
columns = ", ".join(" ".join(v) for v in variables["columns"])
q = f"CREATE TABLE IF NOT EXISTS {table} "\
f"({columns}, PRIMARY KEY({', '.join(variables['primary'])}))"
cursor.execute(q)
# Report progress
if fname.exists():
if existed:
if drop:
msg = f"Local database '{fname}' re-created successfully"
else:
msg = f"Local database '{fname}' not changed"
else:
msg = f"Local database '{fname}' created successfully"
else:
msg = f"Failed to create the local database '{fname}'"
custom_print(msg, verbose)