schema: Continue

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2025-01-30 20:34:44 +01:00
commit c50c614f13
7 changed files with 223 additions and 52 deletions

View file

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from typing import Optional, List, Iterable
from typing import Optional, Iterable
import abc
@ -14,16 +14,16 @@ from .CompositeForeignKey import CompositeForeignKey
class Schema(abc.ABC): # export
def __init__(self) -> None:
self.___tables: Optional[List[Table]] = None
self.__foreign_keys: Optional[List[CompositeForeignKey]] = None
self.__access_defining_columns: Optional[List[str]] = None
self.___tables: Optional[list[Table]] = None
self.__foreign_keys: Optional[list[CompositeForeignKey]] = None
self.__access_defining_columns: Optional[list[str]] = None
@property
def __tables(self):
if self.___tables is None:
ret = dict()
for name in self._table_names():
slog(WARNING, f'Caching metadata for table "{name}"')
slog(DEBUG, f'Caching metadata for table "{name}"')
assert(isinstance(name, str))
ret[name] = self._table(name)
self.___tables = ret
@ -42,7 +42,7 @@ class Schema(abc.ABC): # export
return None # type: ignore
@abc.abstractmethod
def _foreign_keys(self) -> List[CompositeForeignKey]:
def _foreign_keys(self) -> list[CompositeForeignKey]:
pass
@abc.abstractmethod
@ -51,6 +51,18 @@ class Schema(abc.ABC): # export
# ------ API to be called
def __len__(self):
return len(self.__tables)
def __iter__(self):
yield from self.__tables.values()
def __repr__(self):
return '|'.join([table.name for table in self.__tables])
def __getitem__(self, index):
return self.__tables[index]
@property
def table_names(self) -> Iterable[str]:
return self.__tables.keys()
@ -66,7 +78,7 @@ class Schema(abc.ABC): # export
return self.__access_defining_columns
@property
def foreign_key_constraints(self) -> List[CompositeForeignKey]:
def foreign_key_constraints(self) -> list[CompositeForeignKey]:
if self.__foreign_keys is None:
self.__foreign_keys = self._foreign_keys()
return self.__foreign_keys