mirror of
ssh://git.janware.com/srv/git/janware/proj/jw-python
synced 2026-01-15 09:53:32 +01:00
schema: Continue
Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
parent
9cfcc1bd68
commit
c50c614f13
7 changed files with 223 additions and 52 deletions
|
|
@ -20,10 +20,27 @@ class Column(abc.ABC): # export
|
|||
self.__default_value_cached: bool = False
|
||||
self.__is_auto_increment: Optional[bool] = None
|
||||
self.__data_type: DataType = data_type
|
||||
self.__foreign_keys: Optional[Any] = None
|
||||
self.__foreign_keys_cached: bool = False
|
||||
self.__foreign_keys_by_table: Optional[dict[str, Any]] = None
|
||||
|
||||
def __repr__(self):
|
||||
return f'{self.__table.name}.{self.__name}: {self.__data_type}'
|
||||
|
||||
def __eq__(self, rhs) -> bool:
|
||||
if isinstance(rhs, Column):
|
||||
if self.__table != rhs.__table:
|
||||
return False
|
||||
if self.__name != rhs.__name:
|
||||
return False
|
||||
return True
|
||||
elif isinstance(rhs, str):
|
||||
if self.__name != rhs:
|
||||
return False
|
||||
return True
|
||||
throw(ERR, f'Tried to compare column {self} to type {type(rhs)}: {rhs}')
|
||||
return False # Unreachable but requested by mypy
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self.__name
|
||||
|
|
@ -73,3 +90,25 @@ class Column(abc.ABC): # export
|
|||
self.__default_value = self.__table.column_default(self.name)
|
||||
self.__default_value_cached = True
|
||||
return self.__default_value
|
||||
|
||||
# Returns Column object on parent table
|
||||
@property
|
||||
def foreign_keys(self) -> Optional[Any]:
|
||||
if not self.__foreign_keys_cached:
|
||||
fks: list[Any] = []
|
||||
for cfk in self.__table.foreign_key_constraints:
|
||||
for fk in cfk:
|
||||
if fk.child_column == self:
|
||||
fks.append(fk.parent_column)
|
||||
self.__foreign_keys_cached = True
|
||||
self.__foreign_keys = fks if fks else None
|
||||
return self.__foreign_keys
|
||||
|
||||
def foreign_key(self, table) -> Optional[Any]:
|
||||
if self.__foreign_keys_by_table is None:
|
||||
self.__foreign_keys_by_table = dict()
|
||||
for col in self.foreign_keys: # type: ignore # Any not iterable
|
||||
assert(col.table.name not in self.__foreign_keys_by_table)
|
||||
self.__foreign_keys_by_table[col.table.name] = col
|
||||
table_name = table if isinstance(table, str) else table.name
|
||||
return self.__foreign_keys_by_table.get(table_name)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue