summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/elements.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-07-14 22:44:33 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-07-14 22:44:33 -0400
commitf4653729a6ff952555c0192a5b0f0851c4d40ad5 (patch)
treeb6778b1455c76d58f61dc3aa4937cf0593ca86df /lib/sqlalchemy/sql/elements.py
parentdbc8bbfba3591d2ea704673d90e95014765d0f10 (diff)
downloadsqlalchemy-f4653729a6ff952555c0192a5b0f0851c4d40ad5.tar.gz
- wrestle with conv() and tests some more
Diffstat (limited to 'lib/sqlalchemy/sql/elements.py')
-rw-r--r--lib/sqlalchemy/sql/elements.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py
index 1447787ce..4f58f6141 100644
--- a/lib/sqlalchemy/sql/elements.py
+++ b/lib/sqlalchemy/sql/elements.py
@@ -3202,6 +3202,52 @@ class _truncated_label(quoted_name):
return self
+class conv(_truncated_label):
+ """Mark a string indicating that a name has already been converted
+ by a naming convention.
+
+ This is a string subclass that indicates a name that should not be
+ subject to any further naming conventions.
+
+ E.g. when we create a :class:`.Constraint` using a naming convention
+ as follows::
+
+ m = MetaData(naming_convention={
+ "ck": "ck_%(table_name)s_%(constraint_name)s"
+ })
+ t = Table('t', m, Column('x', Integer),
+ CheckConstraint('x > 5', name='x5'))
+
+ The name of the above constraint will be rendered as ``"ck_t_x5"``.
+ That is, the existing name ``x5`` is used in the naming convention as the
+ ``constraint_name`` token.
+
+ In some situations, such as in migration scripts, we may be rendering
+ the above :class:`.CheckConstraint` with a name that's already been
+ converted. In order to make sure the name isn't double-modified, the
+ new name is applied using the :func:`.schema.conv` marker. We can
+ use this explicitly as follows::
+
+
+ m = MetaData(naming_convention={
+ "ck": "ck_%(table_name)s_%(constraint_name)s"
+ })
+ t = Table('t', m, Column('x', Integer),
+ CheckConstraint('x > 5', name=conv('ck_t_x5')))
+
+ Where above, the :func:`.schema.conv` marker indicates that the constraint
+ name here is final, and the name will render as ``"ck_t_x5"`` and not
+ ``"ck_t_ck_t_x5"``
+
+ .. versionadded:: 0.9.4
+
+ .. seealso::
+
+ :ref:`constraint_naming_conventions`
+
+ """
+
+
class _defer_name(_truncated_label):
"""mark a name as 'deferred' for the purposes of automated name
generation.
@@ -3210,6 +3256,8 @@ class _defer_name(_truncated_label):
def __new__(cls, value):
if value is None:
return _NONE_NAME
+ elif isinstance(value, conv):
+ return value
else:
return super(_defer_name, cls).__new__(cls, value)