Skip to content

Commit

Permalink
Fixed #13245: Explained Oracle's behavior w.r.t db_table
Browse files Browse the repository at this point in the history
and how to prevent table-name truncation

Thanks russellm & timo for discussion, and timo for review.
  • Loading branch information
shaib committed Oct 23, 2013
1 parent aefc1d4 commit 317040a
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
16 changes: 16 additions & 0 deletions docs/ref/databases.txt
Expand Up @@ -758,6 +758,22 @@ Naming issues
Oracle imposes a name length limit of 30 characters. To accommodate this, the
backend truncates database identifiers to fit, replacing the final four
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
certain Oracle keywords are used as the name of a model field or the
Expand Down
12 changes: 12 additions & 0 deletions docs/ref/models/options.txt
Expand Up @@ -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
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``
-----------------
Expand Down

0 comments on commit 317040a

Please sign in to comment.