我正在将Django与现有的Oracle DB一起使用(即,表格不是由Django创建的).所以在我的模型中,我必须通过在Meta类中指定db_table的值来指示表名.我遇到了问题,因为我希望访问的表属于与我拥有的凭据不同的用户.我被授权查看表(在SQL Developer中没有问题).
当Oracle表的名称超过30个字节时,Django会删除名称的最后四个字节,并用表名其余部分的可重复的4字节哈希替换它们.对于Django自己的表格来说,这一切都很好.它通常也不会成为访问现有数据库中的表的问题(如我的情况),因为Oracle本身会将名称限制为30个字节.
问题是Django没有单独的工具来注意表属于另一个用户.所以我使用点语法解决方法(通过设置db_table,例如“USERNAME.MY_29_BYTE_TABLE_NAMEXXXXXXXX”),但由于这会导致整个表名超过30个字节,Django会执行截断技巧并尝试查询表名称不存在.
有没有办法防止这种行为,或者以不同的方式指定用户与表名分开?
最佳答案 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.