Skip to content

Commit 7e0ef7d

Browse files
committed
Implement naming conventions for SQLModelGenerator
1 parent 78e322d commit 7e0ef7d

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

src/sqlacodegen/generators.py

+9
Original file line numberDiff line numberDiff line change
@@ -1417,6 +1417,15 @@ def collect_imports_for_column(self, column: Column[Any]) -> None:
14171417

14181418
def render_module_variables(self, models: list[Model]) -> str:
14191419
declarations: list[str] = []
1420+
1421+
if self.metadata.naming_convention != DEFAULT_NAMING_CONVENTION:
1422+
formatted_naming_convention = pformat(self.metadata.naming_convention)
1423+
declarations.append(
1424+
"{}.metadata.naming_convention = {}".format(
1425+
self.base_class_name, formatted_naming_convention
1426+
)
1427+
)
1428+
14201429
if any(not isinstance(model, ModelClass) for model in models):
14211430
declarations.append(f"metadata = {self.base_class_name}.metadata")
14221431

tests/test_generators.py

+73
Original file line numberDiff line numberDiff line change
@@ -2967,3 +2967,76 @@ class SimpleOnetoone(SQLModel, table=True):
29672967
back_populates='simple_onetoone')
29682968
""",
29692969
)
2970+
2971+
def test_constraints_with_default_names(self, generator: CodeGenerator) -> None:
2972+
generator.metadata.naming_convention = {
2973+
"uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
2974+
"ck": "CHECK_%(table_name)s",
2975+
"fk": "FOREIGN_%(table_name)s_%(column_0_key)s_%(referred_table_name)s",
2976+
"pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
2977+
}
2978+
2979+
Table(
2980+
"items",
2981+
generator.metadata,
2982+
Column("id", INTEGER),
2983+
Column("name", VARCHAR),
2984+
Column("container_id", INTEGER),
2985+
PrimaryKeyConstraint("id", "name", name="PRIMARY_items_idname"),
2986+
UniqueConstraint("id", name="UNIQUE_items_id"),
2987+
ForeignKeyConstraint(
2988+
["container_id"],
2989+
["containers.id"],
2990+
name="FOREIGN_items_container_id_containers",
2991+
),
2992+
)
2993+
Table(
2994+
"containers",
2995+
generator.metadata,
2996+
Column("id", INTEGER),
2997+
Column("name", VARCHAR),
2998+
PrimaryKeyConstraint("id", name="PRIMARY_containers_id"),
2999+
UniqueConstraint("id", "name", name="UNIQUE_containers_id_name"),
3000+
CheckConstraint("id > 0", name="CHECK_containers"),
3001+
)
3002+
3003+
validate_code(
3004+
generator.generate(),
3005+
"""\
3006+
from typing import List, Optional
3007+
3008+
from sqlalchemy import CheckConstraint, Column, ForeignKey, Integer, \
3009+
String, UniqueConstraint
3010+
from sqlmodel import Field, Relationship, SQLModel
3011+
3012+
SQLModel.metadata.naming_convention = {'ck': 'CHECK_%(table_name)s',
3013+
'fk': 'FOREIGN_%(table_name)s_%(column_0_key)s_%(referred_table_name)s',
3014+
'pk': 'PRIMARY_%(table_name)s_%(column_0N_name)s',
3015+
'uq': 'UNIQUE_%(table_name)s_%(column_0_N_name)s'}
3016+
3017+
3018+
class Containers(SQLModel, table=True):
3019+
__table_args__ = (
3020+
CheckConstraint('id > 0'),
3021+
UniqueConstraint('id', 'name')
3022+
)
3023+
3024+
id: Optional[int] = Field(default=None, sa_column=Column(\
3025+
'id', Integer, primary_key=True))
3026+
name: Optional[str] = Field(default=None, sa_column=Column(\
3027+
'name', String))
3028+
3029+
items: List['Items'] = Relationship(back_populates='container')
3030+
3031+
3032+
class Items(SQLModel, table=True):
3033+
id: Optional[int] = Field(default=None, sa_column=Column(\
3034+
'id', Integer, primary_key=True, nullable=False, unique=True))
3035+
name: Optional[str] = Field(default=None, sa_column=Column(\
3036+
'name', String, primary_key=True, nullable=False))
3037+
container_id: Optional[int] = Field(default=None, sa_column=Column(\
3038+
'container_id', ForeignKey('containers.id')))
3039+
3040+
container: Optional['Containers'] = Relationship(back_populates='items')
3041+
""",
3042+
)

0 commit comments

Comments
 (0)