61 lines
1.6 KiB
Python
61 lines
1.6 KiB
Python
|
from sqlite3 import Row
|
||
|
from typing import Any, ItemsView
|
||
|
|
||
|
from .fields import BrickRecordFields
|
||
|
from .sql import BrickSQL
|
||
|
|
||
|
|
||
|
# SQLite record
|
||
|
class BrickRecord(object):
|
||
|
select_query: str
|
||
|
insert_query: str
|
||
|
|
||
|
# Fields
|
||
|
fields: BrickRecordFields
|
||
|
|
||
|
def __init__(self, /):
|
||
|
self.fields = BrickRecordFields()
|
||
|
|
||
|
# Load from a record
|
||
|
def ingest(self, record: Row | dict[str, Any], /) -> None:
|
||
|
# Brutally ingest the record
|
||
|
for key in record.keys():
|
||
|
setattr(self.fields, key, record[key])
|
||
|
|
||
|
# Insert into the database
|
||
|
# If we do not commit immediately, we defer the execute() call
|
||
|
def insert(self, /, commit=True) -> None:
|
||
|
database = BrickSQL()
|
||
|
rows, q = database.execute(
|
||
|
self.insert_query,
|
||
|
parameters=self.sql_parameters(),
|
||
|
defer=not commit,
|
||
|
)
|
||
|
|
||
|
if commit:
|
||
|
database.commit()
|
||
|
|
||
|
# Shorthand to field items
|
||
|
def items(self, /) -> ItemsView[str, Any]:
|
||
|
return self.fields.__dict__.items()
|
||
|
|
||
|
# Get from the database using the query
|
||
|
def select(self, /, override_query: str | None = None) -> Row | None:
|
||
|
if override_query:
|
||
|
query = override_query
|
||
|
else:
|
||
|
query = self.select_query
|
||
|
|
||
|
return BrickSQL().fetchone(
|
||
|
query,
|
||
|
parameters=self.sql_parameters()
|
||
|
)
|
||
|
|
||
|
# Generic SQL parameters from fields
|
||
|
def sql_parameters(self, /) -> dict[str, Any]:
|
||
|
parameters: dict[str, Any] = {}
|
||
|
for name, value in self.items():
|
||
|
parameters[name] = value
|
||
|
|
||
|
return parameters
|