@@ -967,6 +967,73 @@ def test_postgresql_sequence_with_schema(self, generator: CodeGenerator) -> None
967967 """ ,
968968 )
969969
970+ def test_constraints_with_default_names (self , generator : CodeGenerator ) -> None :
971+ generator .metadata .naming_convention = {
972+ "uq" : "UNIQUE_%(table_name)s_%(column_0_N_name)s" ,
973+ "ck" : "CHECK_%(table_name)s" ,
974+ "fk" : "FOREIGN_%(table_name)s_%(column_0_key)s"
975+ "_%(referred_table_name)s_%(referred_column_0_label)s" ,
976+ "pk" : "PRIMARY_%(table_name)s_%(column_0N_name)s" ,
977+ }
978+
979+ Table (
980+ "items" ,
981+ generator .metadata ,
982+ Column ("id" , INTEGER ),
983+ Column ("name" , VARCHAR ),
984+ Column ("container_id" , INTEGER ),
985+ PrimaryKeyConstraint ("id" , "name" , name = "PRIMARY_items_idname" ),
986+ UniqueConstraint ("id" , name = "UNIQUE_items_id" ),
987+ ForeignKeyConstraint (
988+ ["container_id" ],
989+ ["containers.id" ],
990+ name = "FOREIGN_items_container_id_containers_id" ,
991+ ),
992+ )
993+ Table (
994+ "containers" ,
995+ generator .metadata ,
996+ Column ("id" , INTEGER ),
997+ Column ("name" , VARCHAR ),
998+ PrimaryKeyConstraint ("id" , name = "PRIMARY_containers_id" ),
999+ UniqueConstraint ("id" , "name" , name = "UNIQUE_containers_id_name" ),
1000+ CheckConstraint ("id > 0" , name = "CHECK_containers" ),
1001+ )
1002+
1003+ validate_code (
1004+ generator .generate (),
1005+ """\
1006+ from sqlalchemy import CheckConstraint, Column, ForeignKey, \
1007+ Integer, MetaData, String, Table, UniqueConstraint
1008+
1009+ metadata = MetaData(
1010+ naming_convention={
1011+ "uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
1012+ "ck": "CHECK_%(table_name)s",
1013+ "fk": "FOREIGN_%(table_name)s_%(column_0_key)s_\
1014+ %(referred_table_name)s_%(referred_column_0_label)s",
1015+ "pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
1016+ }
1017+ )
1018+
1019+
1020+ t_containers = Table(
1021+ 'containers', metadata,
1022+ Column('id', Integer, primary_key=True),
1023+ Column('name', String),
1024+ CheckConstraint('id > 0'),
1025+ UniqueConstraint('id', 'name')
1026+ )
1027+
1028+ t_items = Table(
1029+ 'items', metadata,
1030+ Column('id', Integer, primary_key=True, nullable=False, unique=True),
1031+ Column('name', String, primary_key=True, nullable=False),
1032+ Column('container_id', ForeignKey('containers.id'))
1033+ )
1034+ """ ,
1035+ )
1036+
9701037
9711038class TestDeclarativeGenerator :
9721039 @pytest .fixture
@@ -2672,6 +2739,89 @@ class Simple:
26722739 """ ,
26732740 )
26742741
2742+ def test_constraints_with_default_names (self , generator : CodeGenerator ) -> None :
2743+ generator .metadata .naming_convention = {
2744+ "uq" : "UNIQUE_%(table_name)s_%(column_0_N_name)s" ,
2745+ "ck" : "CHECK_%(table_name)s" ,
2746+ "fk" : "FOREIGN_%(table_name)s_%(column_0_key)s"
2747+ "_%(referred_table_name)s_%(referred_column_0_label)s" ,
2748+ "pk" : "PRIMARY_%(table_name)s_%(column_0N_name)s" ,
2749+ }
2750+
2751+ Table (
2752+ "items" ,
2753+ generator .metadata ,
2754+ Column ("id" , INTEGER ),
2755+ Column ("name" , VARCHAR ),
2756+ Column ("container_id" , INTEGER ),
2757+ PrimaryKeyConstraint ("id" , "name" , name = "PRIMARY_items_idname" ),
2758+ UniqueConstraint ("id" , name = "UNIQUE_items_id" ),
2759+ ForeignKeyConstraint (
2760+ ["container_id" ],
2761+ ["containers.id" ],
2762+ name = "FOREIGN_items_container_id_containers_id" ,
2763+ ),
2764+ )
2765+ Table (
2766+ "containers" ,
2767+ generator .metadata ,
2768+ Column ("id" , INTEGER ),
2769+ Column ("name" , VARCHAR ),
2770+ PrimaryKeyConstraint ("id" , name = "PRIMARY_containers_id" ),
2771+ UniqueConstraint ("id" , "name" , name = "UNIQUE_containers_id_name" ),
2772+ CheckConstraint ("id > 0" , name = "CHECK_containers" ),
2773+ )
2774+
2775+ validate_code (
2776+ generator .generate (),
2777+ """\
2778+ from __future__ import annotations
2779+ from dataclasses import dataclass, field
2780+ from typing import List, Optional
2781+ from sqlalchemy import CheckConstraint, Column, ForeignKey, \
2782+ Integer, String, UniqueConstraint
2783+ from sqlalchemy.orm import registry, relationship
2784+ metadata = MetaData(
2785+ naming_convention={
2786+ "uq": "UNIQUE_%(table_name)s_%(column_0_N_name)s",
2787+ "ck": "CHECK_%(table_name)s",
2788+ "fk": "FOREIGN_%(table_name)s_%(column_0_key)s_\
2789+ %(referred_table_name)s_%(referred_column_0_label)s",
2790+ "pk": "PRIMARY_%(table_name)s_%(column_0N_name)s",
2791+ }
2792+ )
2793+ mapper_registry = registry(metadata=metadata)
2794+ @mapper_registry.mapped
2795+ @dataclass
2796+ class Containers:
2797+ __tablename__ = 'containers'
2798+ __table_args__ = (
2799+ CheckConstraint('id > 0'),
2800+ UniqueConstraint('id', 'name')
2801+ )
2802+ __sa_dataclass_metadata_key__ = 'sa'
2803+ id: int = field(init=False, metadata={'sa': \
2804+ Column(Integer, primary_key=True)})
2805+ name: Optional[str] = field(default=None, metadata={'sa': \
2806+ Column(String)})
2807+ items: List[Items] = field(default_factory=list, metadata={'sa': \
2808+ relationship('Items', back_populates='container')})
2809+ @mapper_registry.mapped
2810+ @dataclass
2811+ class Items:
2812+ __tablename__ = 'items'
2813+ __sa_dataclass_metadata_key__ = 'sa'
2814+ id: int = field(init=False, metadata={'sa': \
2815+ Column(Integer, primary_key=True, nullable=False, unique=True)})
2816+ name: str = field(init=False, metadata={'sa': \
2817+ Column(String, primary_key=True, nullable=False)})
2818+ container_id: Optional[int] = field(default=None, metadata={'sa': \
2819+ Column(ForeignKey('containers.id'))})
2820+ container: Optional[Containers] = field(default=None, metadata={'sa': \
2821+ relationship('Containers', back_populates='items')})
2822+ """ ,
2823+ )
2824+
26752825
26762826class TestSQLModelGenerator :
26772827 @pytest .fixture
0 commit comments