【问题标题】:Can Django be prevented from truncating long table names?可以防止 Django 截断长表名吗?
【发布时间】:2011-08-04 22:50:07
【问题描述】:

我将 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”),但由于这会导致 overall 表名超过 30 个字节,Django 会使用它的截断技巧并尝试查询一个不存在的表名。

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

【问题讨论】:

  • 这听起来可能是 django! 中的一个合法错误,您应该查看 code.djangoproject.com/query 中是否有任何相关内容,如果没有,请添加新票。
  • 考虑使用 LOGIN 触发器并 ALTER SESSION SET CURRENT_SCHEMA 而不是为每个表指定所有者
  • 很好的建议,两者都是。如果我理解正确,Gary 的想法只有在您希望访问的所有表都属于同一用户时才有效。虽然对我来说就是这种情况,但对于其他情况,下面 SuperDuper 建议的解决方案可能更有用。谢谢!

标签: django oracle


【解决方案1】:

在Oracle Django DB 后端由quote_name 方法导致截断,该方法遵循SQL92 要求并使用硬编码值max_name_length。

您可以通过创建自定义数据库后端或通过这样的猴子补丁来覆盖此行为:

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

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

【讨论】:

  • 这告诉我如何防止这种行为。谢谢!实际上,我并没有指定 >30 个字符的表名,Django 只是认为我是因为需要额外的字节来指示用户。我想这个解决方案在你混合了 Django 生成的表(即使用默认的 APPNAME_MODLENAME 命名约定)和 Oracle 中预先存在的表的情况下不太可行,因为如果你提高这个值,Django 真的可能会尝试创建名称过长的表。但我想你可以通过在这种情况下始终指定 db_table 来控制它。
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 2010-11-21
  • 2016-05-09
  • 2011-10-03
  • 2010-10-22
  • 2021-08-25
相关资源
最近更新 更多