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

Mar*_*lee 6 oracle django

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

\n\n

当 Oracle 表的名称超过 30 个字节时,Django 会截掉名称的最后 4 个字节,并将其替换为表\xe2\x80\x99 名称其余部分的可重复 4 字节哈希值。这对于 Django 自己制作的表来说非常好。通常,访问现有数据库中的表(如我的情况)时,xe2x80x99 也不会成为问题,因为 Oracle 本身会将名称限制为 30 个字节。

\n\n

问题是 Django 没有\xe2\x80\x99t 有单独的工具来标记该表属于另一个用户。因此,我使用点语法解决方法(只需将 db_table 设置为 \xe2\x80\x9cUSERNAME.MY_29_BYTE_TABLE_NAMEXXXXXXXX\xe2\x80\x9d ),但由于这会导致整个名称超过 30 个字节,Django 会这样做截断技巧并尝试查询不存在的表名\xe2\x80\x99。

\n\n

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

\n

Vic*_*kov 5

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

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

from django.db.backends.oracle.base import DatabaseOperations
DatabaseOperations.max_name_length = lambda s: <NEW_MAX_VALUE>
Run Code Online (Sandbox Code Playgroud)

目前还不清楚为什么表名需要超过 30 个字符,因为它违反了Oracle 模式对象命名规则