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