Commits

Mike Bayer  committed a7ef7ec

:paramref:`.MetaData.naming_convention` feature will now also
apply to :class:`.CheckConstraint` objects that are associated
directly with a :class:`.Column` instead of just on the
:class:`.Table`.

  • Participants
  • Parent commits d85d6f9

Comments (0)

Files changed (3)

File doc/build/changelog/changelog_09.rst

 
     .. change::
         :tags: bug, sql
+
+        :paramref:`.MetaData.naming_convention` feature will now also
+        apply to :class:`.CheckConstraint` objects that are associated
+        directly with a :class:`.Column` instead of just on the
+        :class:`.Table`.
+
+    .. change::
+        :tags: bug, sql
         :tickets: 2991
 
         Fixed bug in new :paramref:`.MetaData.naming_convention` feature

File lib/sqlalchemy/sql/naming.py

 """
 
 from .schema import Constraint, ForeignKeyConstraint, PrimaryKeyConstraint, \
-                UniqueConstraint, CheckConstraint, Index, Table
+                UniqueConstraint, CheckConstraint, Index, Table, Column
 from .. import event, events
 from .. import exc
 from .elements import _truncated_label
 @event.listens_for(Constraint, "after_parent_attach")
 @event.listens_for(Index, "after_parent_attach")
 def _constraint_name(const, table):
-    if isinstance(table, Table):
+    if isinstance(table, Column):
+        # for column-attached constraint, set another event
+        # to link the column attached to the table as this constraint
+        # associated with the table.
+        event.listen(table, "after_parent_attach",
+                    lambda col, table: _constraint_name(const, table)
+                )
+    elif isinstance(table, Table):
         metadata = table.metadata
         convention = _get_convention(metadata.naming_convention, type(const))
         if convention is not None:

File test/sql/test_metadata.py

             CheckConstraint, u1.c.data == 'x'
         )
 
+    def test_column_attached_ck_name(self):
+        m = MetaData(naming_convention={
+                        "ck": "ck_%(table_name)s_%(constraint_name)s"
+                    })
+        ck = CheckConstraint('x > 5', name='x1')
+        Table('t', m, Column('x', ck))
+        eq_(ck.name, "ck_t_x1")
+
+    def test_table_attached_ck_name(self):
+        m = MetaData(naming_convention={
+                        "ck": "ck_%(table_name)s_%(constraint_name)s"
+                    })
+        ck = CheckConstraint('x > 5', name='x1')
+        Table('t', m, Column('x', Integer), ck)
+        eq_(ck.name, "ck_t_x1")
+
+
     def test_fk_name_schema(self):
         u1 = self._fixture(naming_convention={
                 "fk": "fk_%(table_name)s_%(column_0_name)s_"