From 317040a73b77be8f8210801793b2ce6d1a69301e Mon Sep 17 00:00:00 2001 From: Shai Berger Date: Mon, 21 Oct 2013 18:12:48 +0300 Subject: [PATCH] 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. --- docs/ref/databases.txt | 16 ++++++++++++++++ docs/ref/models/options.txt | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index 0b8c7cdf96..7be439ce81 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -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 diff --git a/docs/ref/models/options.txt b/docs/ref/models/options.txt index b3d6533f9f..22ced5fe7d 100644 --- a/docs/ref/models/options.txt +++ b/docs/ref/models/options.txt @@ -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 ` 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 ` for more details. ``db_tablespace`` -----------------