Browse files

Fixed #5725 -- Fixed varchar column size introspection for MySQL

Thanks ferdonline for the initial patch and Karen Tracey for the
related post on django-users.
  • Loading branch information...
1 parent fb3d916 commit 879b245baa727090e242c482a8f12ee52f169642 @claudep claudep committed Aug 30, 2012
Showing with 18 additions and 2 deletions.
  1. +13 −2 django/db/backends/mysql/introspection.py
  2. +5 −0 tests/regressiontests/introspection/tests.py
View
15 django/db/backends/mysql/introspection.py
@@ -36,9 +36,20 @@ def get_table_list(self, cursor):
return [row[0] for row in cursor.fetchall()]
def get_table_description(self, cursor, table_name):
- "Returns a description of the table, with the DB-API cursor.description interface."
+ """
+ Returns a description of the table, with the DB-API cursor.description interface."
+ """
+ # varchar length returned by cursor.description is an internal length,
+ # not visible length (#5725), use information_schema database to fix this
+ cursor.execute("""
+ SELECT column_name, character_maximum_length FROM information_schema.columns
+ WHERE table_name = %s AND table_schema = DATABASE()
+ AND character_maximum_length IS NOT NULL""", [table_name])
+ length_map = dict(cursor.fetchall())
+
cursor.execute("SELECT * FROM %s LIMIT 1" % self.connection.ops.quote_name(table_name))
- return cursor.description
+ return [line[:3] + (length_map.get(line[0], line[3]),) + line[4:]
+ for line in cursor.description]
def _name_to_index(self, cursor, table_name):
"""
View
5 tests/regressiontests/introspection/tests.py
@@ -89,6 +89,11 @@ def test_get_table_description_types(self):
[datatype(r[1], r) for r in desc],
['IntegerField', 'CharField', 'CharField', 'CharField', 'BigIntegerField']
)
+ # Check also length of CharFields
+ self.assertEqual(
+ [r[3] for r in desc if datatype(r[1], r) == 'CharField'],
+ [30, 30, 75]
+ )
# Oracle forces null=True under the hood in some cases (see
# https://docs.djangoproject.com/en/dev/ref/databases/#null-and-empty-strings)

0 comments on commit 879b245

Please sign in to comment.