Skip to content

Commit 0930157

Browse files
committed
Implement naming conventions for DataclassGenerator
1 parent c050a47 commit 0930157

File tree

2 files changed

+53
-42
lines changed

2 files changed

+53
-42
lines changed

src/sqlacodegen/generators.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,6 +1288,15 @@ def render_module_variables(self, models: list[Model]) -> str:
12881288
return super().render_module_variables(models)
12891289

12901290
declarations: list[str] = ["mapper_registry = registry()"]
1291+
1292+
if self.metadata.naming_convention != DEFAULT_NAMING_CONVENTION:
1293+
formatted_naming_convention = pformat(self.metadata.naming_convention)
1294+
declarations.append(
1295+
"mapper_registry.metadata.naming_convention = {}".format(
1296+
formatted_naming_convention
1297+
)
1298+
)
1299+
12911300
if any(not isinstance(model, ModelClass) for model in models):
12921301
declarations.append("metadata = mapper_registry.metadata")
12931302

tests/test_generators.py

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2728,13 +2728,11 @@ class Simple:
27282728
""",
27292729
)
27302730

2731-
@pytest.mark.xfail
27322731
def test_constraints_with_default_names(self, generator: CodeGenerator) -> None:
27332732
generator.metadata.naming_convention = {
27342733
"uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
27352734
"ck": "CHECK_%(table_name)s",
2736-
"fk": "FOREIGN_%(table_name)s_%(column_0_key)s"
2737-
"_%(referred_table_name)s_%(referred_column_0_label)s",
2735+
"fk": "FOREIGN_%(table_name)s_%(column_0_key)s_%(referred_table_name)s",
27382736
"pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
27392737
}
27402738

@@ -2749,7 +2747,7 @@ def test_constraints_with_default_names(self, generator: CodeGenerator) -> None:
27492747
ForeignKeyConstraint(
27502748
["container_id"],
27512749
["containers.id"],
2752-
name="FOREIGN_items_container_id_containers_id",
2750+
name="FOREIGN_items_container_id_containers",
27532751
),
27542752
)
27552753
Table(
@@ -2765,49 +2763,53 @@ def test_constraints_with_default_names(self, generator: CodeGenerator) -> None:
27652763
validate_code(
27662764
generator.generate(),
27672765
"""\
2768-
from __future__ import annotations
2769-
from dataclasses import dataclass, field
2770-
from typing import List, Optional
2771-
from sqlalchemy import CheckConstraint, Column, ForeignKey, \
2766+
from __future__ import annotations
2767+
2768+
from dataclasses import dataclass, field
2769+
from typing import List, Optional
2770+
2771+
from sqlalchemy import CheckConstraint, Column, ForeignKey, \
27722772
Integer, String, UniqueConstraint
2773-
from sqlalchemy.orm import registry, relationship
2774-
metadata = MetaData(
2775-
naming_convention={
2776-
"uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
2777-
"ck": "CHECK_%(table_name)s",
2778-
"fk": "FOREIGN_%(table_name)s_%(column_0_key)s_\
2779-
%(referred_table_name)s_%(referred_column_0_label)s",
2780-
"pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
2781-
}
2782-
)
2783-
mapper_registry = registry(metadata=metadata)
2784-
@mapper_registry.mapped
2785-
@dataclass
2786-
class Containers:
2787-
__tablename__ = 'containers'
2788-
__table_args__ = (
2789-
CheckConstraint('id > 0'),
2790-
UniqueConstraint('id', 'name')
2791-
)
2792-
__sa_dataclass_metadata_key__ = 'sa'
2793-
id: int = field(init=False, metadata={'sa': \
2794-
Column(Integer, primary_key=True)})
2795-
name: Optional[str] = field(default=None, metadata={'sa': \
2796-
Column(String)})
2797-
items: List[Items] = field(default_factory=list, metadata={'sa': \
2773+
from sqlalchemy.orm import registry, relationship
2774+
2775+
mapper_registry = registry()
2776+
mapper_registry.metadata.naming_convention = {'ck': 'CHECK_%(table_name)s',
2777+
'fk': 'FOREIGN_%(table_name)s_%(column_0_key)s_%(referred_table_name)s',
2778+
'pk': 'PRIMARY_%(table_name)s_%(column_0N_name)s',
2779+
'uq': 'UNIQUE_%(table_name)s_%(column_0_N_name)s'}
2780+
2781+
2782+
@mapper_registry.mapped
2783+
@dataclass
2784+
class Containers:
2785+
__tablename__ = 'containers'
2786+
__table_args__ = (
2787+
CheckConstraint('id > 0'),
2788+
UniqueConstraint('id', 'name')
2789+
)
2790+
__sa_dataclass_metadata_key__ = 'sa'
2791+
2792+
id: int = field(init=False, metadata={'sa': Column(Integer, primary_key=True)})
2793+
name: Optional[str] = field(default=None, metadata={'sa': Column(String)})
2794+
2795+
items: List[Items] = field(default_factory=list, metadata={'sa': \
27982796
relationship('Items', back_populates='container')})
2799-
@mapper_registry.mapped
2800-
@dataclass
2801-
class Items:
2802-
__tablename__ = 'items'
2803-
__sa_dataclass_metadata_key__ = 'sa'
2804-
id: int = field(init=False, metadata={'sa': \
2797+
2798+
2799+
@mapper_registry.mapped
2800+
@dataclass
2801+
class Items:
2802+
__tablename__ = 'items'
2803+
__sa_dataclass_metadata_key__ = 'sa'
2804+
2805+
id: int = field(init=False, metadata={'sa': \
28052806
Column(Integer, primary_key=True, nullable=False, unique=True)})
2806-
name: str = field(init=False, metadata={'sa': \
2807+
name: str = field(init=False, metadata={'sa': \
28072808
Column(String, primary_key=True, nullable=False)})
2808-
container_id: Optional[int] = field(default=None, metadata={'sa': \
2809+
container_id: Optional[int] = field(default=None, metadata={'sa': \
28092810
Column(ForeignKey('containers.id'))})
2810-
container: Optional[Containers] = field(default=None, metadata={'sa': \
2811+
2812+
container: Optional[Containers] = field(default=None, metadata={'sa': \
28112813
relationship('Containers', back_populates='items')})
28122814
""",
28132815
)

0 commit comments

Comments
 (0)