wip - remove literal binds

This commit is contained in:
collerek
2022-01-05 18:19:14 +01:00
parent aab46de800
commit 3f264d974b
4 changed files with 77 additions and 33 deletions

View File

@ -35,6 +35,7 @@ class AliasManager:
def __init__(self) -> None:
self._aliases_new: Dict[str, str] = dict()
self._reversed_aliases: Dict[str, str] = dict()
self._prefixed_tables: Dict[str, text] = dict()
def __contains__(self, item: str) -> bool:
return self._aliases_new.__contains__(item)
@ -77,15 +78,20 @@ class AliasManager:
:rtype: List[text]
"""
alias = f"{alias}_" if alias else ""
aliased_fields = [f"{alias}{x}" for x in fields]
# TODO: check if normal fields still needed or only aliased one
all_columns = (
table.columns
if not fields
else [col for col in table.columns if col.name in fields]
else [
col
for col in table.columns
if col.name in fields or col.name in aliased_fields
]
)
return [column.label(f"{alias}{column.name}") for column in all_columns]
@staticmethod
def prefixed_table_name(alias: str, table: sqlalchemy.Table) -> text:
def prefixed_table_name(self, alias: str, table: sqlalchemy.Table) -> text:
"""
Creates text clause with table name with aliased name.
@ -96,7 +102,9 @@ class AliasManager:
:return: sqlalchemy text clause as "table_name aliased_name"
:rtype: sqlalchemy text clause
"""
return table.alias(f"{alias}_{table.name}")
full_alias = f"{alias}_{table.name}"
key = f"{full_alias}_{id(table)}"
return self._prefixed_tables.setdefault(key, table.alias(full_alias))
def add_relation_type(
self, source_model: Type["Model"], relation_name: str, reverse_name: str = None