可以阻止Django截断长表名吗?

时间:2011-08-04 22:50:08

标签: django oracle

我正在将Django与现有的Oracle数据库一起使用(即,表格不是由Django创建的)。所以在我的模型中,我必须通过在Meta类中指定db_table的值来指示表名。我遇到了问题,因为我希望访问的表属于与我拥有的凭据不同的用户。我被授权查看表(在SQL Developer中没有问题)。

当Oracle表的名称超过30个字节时,Django会删除名称的最后四个字节,并用表名其余部分的可重复的4字节哈希替换它们。对于Django自己的表格来说,这一切都很好。它通常也不会成为访问现有数据库中的表的问题(如我的情况),因为Oracle本身会将名称限制为30个字节。

问题是Django没有单独的工具来注意该表属于另一个用户。所以我使用点语法解决方法(通过设置db_table,例如“USERNAME.MY_29_BYTE_TABLE_NAMEXXXXXXXX”),但由于这会导致整体表名超过30个字节,Django会截断它的截断技巧并尝试查询不存在的表名。

有没有办法防止这种行为,或者用不同的方式指定用户与表名分开?

1 个答案:

答案 0 :(得分:2)

Truncate是由quote_name方法在Oracle Django DB后端引起的,该方法遵循SQL92要求并使用硬编码值max_name_length

您可以通过创建自定义数据库后端或monkeypatch来覆盖此行为,如下所示:

from django.db.backends.oracle.base import DatabaseOperations
DatabaseOperations.max_name_length = lambda s: <NEW_MAX_VALUE>

为什么表名中需要超过30个字符并不是很清楚,因为它违反了Oracle Schema Object Naming Rules