【发布时间】: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 建议的解决方案可能更有用。谢谢!