forked from agronholm/sqlacodegen
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.py
More file actions
34 lines (25 loc) · 1.41 KB
/
utils.py
File metadata and controls
34 lines (25 loc) · 1.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from typing import List, Set
from sqlalchemy import CheckConstraint
from sqlalchemy.engine import Connectable
from sqlalchemy.sql import ClauseElement
from sqlalchemy.sql.schema import (
ColumnCollectionConstraint, Constraint, ForeignKeyConstraint, Table)
def get_column_names(constraint: ColumnCollectionConstraint) -> List[str]:
return list(constraint.columns.keys())
def get_constraint_sort_key(constraint: Constraint) -> str:
if isinstance(constraint, CheckConstraint):
return f'C{constraint.sqltext}'
elif isinstance(constraint, ColumnCollectionConstraint):
return constraint.__class__.__name__[0] + repr(get_column_names(constraint))
else:
return str(constraint)
def get_compiled_expression(statement: ClauseElement, bind: Connectable) -> str:
"""Return the statement in a form where any placeholders have been filled in."""
return str(statement.compile(bind, compile_kwargs={"literal_binds": True}))
def get_common_fk_constraints(table1: Table, table2: Table) -> Set[ForeignKeyConstraint]:
"""Return a set of foreign key constraints the two tables have against each other."""
c1 = set(c for c in table1.constraints if isinstance(c, ForeignKeyConstraint) and
c.elements[0].column.table == table2)
c2 = set(c for c in table2.constraints if isinstance(c, ForeignKeyConstraint) and
c.elements[0].column.table == table1)
return c1.union(c2)