Fixed #13245: Explained Oracle's behavior w.r.t db_table

and how to prevent table-name truncation

Thanks russellm & timo for discussion, and timo for review.
This commit is contained in:
Shai Berger 2013-10-21 18:12:48 +03:00
parent aefc1d4e65
commit 317040a73b
2 changed files with 28 additions and 0 deletions

View File

@ -758,6 +758,22 @@ Naming issues
Oracle imposes a name length limit of 30 characters. To accommodate this, the Oracle imposes a name length limit of 30 characters. To accommodate this, the
backend truncates database identifiers to fit, replacing the final four backend truncates database identifiers to fit, replacing the final four
characters of the truncated name with a repeatable MD5 hash value. characters of the truncated name with a repeatable MD5 hash value.
Additionally, the backend turns database identifiers to all-uppercase.
To prevent these transformations (this is usually required only when dealing
with legacy databases or accessing tables which belong to other users), use
a quoted name as the value for ``db_table``::
class LegacyModel(models.Model):
class Meta:
db_table = '"name_left_in_lowercase"'
class ForeignModel(models.Model):
class Meta:
db_table = '"OTHER_USER"."NAME_ONLY_SEEMS_OVER_30"'
Quoted names can also be used with Django's other supported database
backends; except for Oracle, however, the quotes have no effect.
When running ``migrate``, an ``ORA-06552`` error may be encountered if When running ``migrate``, an ``ORA-06552`` error may be encountered if
certain Oracle keywords are used as the name of a model field or the certain Oracle keywords are used as the name of a model field or the

View File

@ -72,6 +72,18 @@ Django quotes column and table names behind the scenes.
the table name via ``db_table``, particularly if you are using the MySQL the table name via ``db_table``, particularly if you are using the MySQL
backend. See the :ref:`MySQL notes <mysql-notes>` for more details. backend. See the :ref:`MySQL notes <mysql-notes>` for more details.
.. admonition:: Table name quoting for Oracle
In order to to meet the 30-char limitation Oracle has on table names,
and match the usual conventions for Oracle databases, Django may shorten
table names and turn them all-uppercase. To prevent such transformations,
use a quoted name as the value for ``db_table``::
db_table = '"name_left_in_lowercase"'
Such quoted names can also be used with Django's other supported database
backends; except for Oracle, however, the quotes have no effect. See the
:ref:`Oracle notes <oracle-notes>` for more details.
``db_tablespace`` ``db_tablespace``
----------------- -----------------