]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- changelog for [ticket:2704]
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Jun 2013 18:47:04 +0000 (14:47 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Jun 2013 18:56:00 +0000 (14:56 -0400)
- use an isinstance() check, concerned a TypeError might be indiscriminate

Conflicts:
doc/build/changelog/changelog_09.rst

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/dialects/mysql/base.py

index e3b14bc28e962c534cb238005de63fcce4c13977..00d8c121be881f13c369c5ae70628e1f3fe38401 100644 (file)
@@ -6,6 +6,15 @@
 .. changelog::
     :version: 0.8.2
 
+    .. change::
+        :tags: feature, mysql
+        :tickets: 2704
+
+        The ``mysql_length`` parameter used with :class:`.Index` can now
+        be passed as a dictionary of column names/lengths, for use
+        with composite indexes.  Big thanks to Roman Podolyaka for the
+        patch.
+
     .. change::
         :tags: bug, mssql
         :tickets: 2747
index a71d07f0cc08a0dc1abf60a0e11889f403e1eea6..f295db40af9594c2ca17066466cec4a87b6974c9 100644 (file)
@@ -226,6 +226,7 @@ become part of the index. SQLAlchemy provides this feature via the
 ``mysql_length`` parameter::
 
     Index('my_index', my_table.c.data, mysql_length=10)
+
     Index('a_b_idx', my_table.c.a, my_table.c.b, mysql_length={'a': 4, 'b': 9})
 
 Prefix lengths are given in characters for nonbinary string types and in bytes
@@ -236,6 +237,9 @@ prefix length values for corresponding columns. MySQL only allows a length for
 a column of an index if it is for a CHAR, VARCHAR, TEXT, BINARY, VARBINARY and
 BLOB.
 
+.. versionadded:: 0.8.2 ``mysql_length`` may now be specified as a dictionary
+   for use with composite indexes.
+
 Index Types
 ~~~~~~~~~~~~~
 
@@ -1529,19 +1533,19 @@ class MySQLDDLCompiler(compiler.DDLCompiler):
         if 'mysql_length' in index.kwargs:
             length = index.kwargs['mysql_length']
 
-            # length value can be an integer value specifying the same
-            # prefix length for all columns of the index
-            try:
+            if isinstance(length, dict):
+                # length value can be a (column_name --> integer value) mapping
+                # specifying the prefix length for each column of the index
                 columns = ', '.join(
-                    '%s(%d)' % (col, length)
+                    ('%s(%d)' % (col, length[col])
+                     if col in length else '%s' % col)
                     for col in columns
                 )
-            # otherwise it's a (column_name --> integer value) mapping
-            # specifying the prefix length for each column of the index
-            except TypeError:
+            else:
+                # or can be an integer value specifying the same
+                # prefix length for all columns of the index
                 columns = ', '.join(
-                    ('%s(%d)' % (col, length[col])
-                     if col in length else '%s' % col)
+                    '%s(%d)' % (col, length)
                     for col in columns
                 )
         else: