From 8d6c2517315660fbf9e69ae6b7595f33a10e5e43 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sat, 10 Sep 2011 20:06:10 +0000 Subject: [PATCH] Fixed #16592 -- More test changes and documentation to account for MySQL's casual relationship with sanity. Thanks to Jim Dalton for the report and patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16787 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- docs/ref/databases.txt | 13 +++++++++++++ docs/ref/models/options.txt | 7 +++++++ tests/modeltests/unmanaged_models/models.py | 16 ++++++++-------- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index d9ea008521..24f5bee0d0 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -326,6 +326,19 @@ storage engine, you have a couple of options. .. _AlterModelOnSyncDB: http://code.djangoproject.com/wiki/AlterModelOnSyncDB +Table names +----------- + +There are `known issues`_ in even the latest versions of MySQL that can cause the +case of a table name to be altered when certain SQL statements are executed +under certain conditions. It is recommended that you use lowercase table +names, if possible, to avoid any problems that might arise from this behavior. +Django uses lowercase table names when it auto-generates table names from +models, so this is mainly a consideration if you are overriding the table name +via the :class:`~django.db.models.Options.db_table` parameter. + +.. _known issues: http://bugs.mysql.com/bug.php?id=48875 + Notes on specific fields ------------------------ diff --git a/docs/ref/models/options.txt b/docs/ref/models/options.txt index cf1b3f97e4..010d93d9a3 100644 --- a/docs/ref/models/options.txt +++ b/docs/ref/models/options.txt @@ -61,6 +61,13 @@ If your database table name is an SQL reserved word, or contains characters that aren't allowed in Python variable names -- notably, the hyphen -- that's OK. Django quotes column and table names behind the scenes. +.. admonition:: Use lowercase table names for MySQL + + It is strongly advised that you use lowercase table names when you override + the table name via ``db_table``, particularly if you are using the MySQL + backend. See the :ref:`MySQL notes ` for more details. + + ``db_tablespace`` ----------------- diff --git a/tests/modeltests/unmanaged_models/models.py b/tests/modeltests/unmanaged_models/models.py index bfbd5447f2..00303cf17a 100644 --- a/tests/modeltests/unmanaged_models/models.py +++ b/tests/modeltests/unmanaged_models/models.py @@ -12,7 +12,7 @@ class A01(models.Model): f_b = models.IntegerField() class Meta: - db_table = 'A01' + db_table = 'a01' def __unicode__(self): return self.f_a @@ -23,7 +23,7 @@ class B01(models.Model): f_b = models.IntegerField() class Meta: - db_table = 'B01' + db_table = 'b01' # 'managed' is True by default. This tests we can set it explicitly. managed = True @@ -31,12 +31,12 @@ class B01(models.Model): return self.f_a class C01(models.Model): - mm_a = models.ManyToManyField(A01, db_table='D01') + mm_a = models.ManyToManyField(A01, db_table='d01') f_a = models.CharField(max_length=10, db_index=True) f_b = models.IntegerField() class Meta: - db_table = 'C01' + db_table = 'c01' def __unicode__(self): return self.f_a @@ -49,7 +49,7 @@ class A02(models.Model): f_a = models.CharField(max_length=10, db_index=True) class Meta: - db_table = 'A01' + db_table = 'a01' managed = False def __unicode__(self): @@ -57,7 +57,7 @@ class A02(models.Model): class B02(models.Model): class Meta: - db_table = 'B01' + db_table = 'b01' managed = False fk_a = models.ForeignKey(A02) @@ -75,7 +75,7 @@ class C02(models.Model): f_b = models.IntegerField() class Meta: - db_table = 'C01' + db_table = 'c01' managed = False def __unicode__(self): @@ -86,7 +86,7 @@ class Intermediate(models.Model): c02 = models.ForeignKey(C02, db_column="c01_id") class Meta: - db_table = 'D01' + db_table = 'd01' managed = False #