From: Mike Bayer Date: Sat, 8 Jun 2013 18:47:04 +0000 (-0400) Subject: - changelog for [ticket:2704] X-Git-Tag: rel_0_8_2~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f6006953eedf234d8248f26499787ce6386bcf1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - changelog for [ticket:2704] - use an isinstance() check, concerned a TypeError might be indiscriminate Conflicts: doc/build/changelog/changelog_09.rst --- diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index e3b14bc28e..00d8c121be 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -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 diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index a71d07f0cc..f295db40af 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -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: