我有一个 Django(版本 1.5)应用程序出现此 Oracle 错误:
ORA-01461: can bind a LONG value only for insert into a LONG column
在进行了一些数据库调试之后,问题似乎是由在 DJANGO_SESSION 表上执行 INSERT 引起的,该表具有 SESSION_DATA(数据类型 NCLOB)的长(大约 2.5k 个字符)Unicode 字符串值。
一位同事告诉我,问题不会发生在 UPDATE 上,而只会出现在 INSERT 上,因为 UPDATE 的 Django 数据库代码包含逻辑(我在这里解释)将数据库写入拆分为可管理的 block ,但对于INSERT 缺少逻辑的某些原因。
有了这些信息,我想我可以通过编写一小块自定义中间件来解决它数据已设置,这将导致更新而不是插入。
然而,事情似乎并没有那么简单。如果我在“django.contrib.sessions.middleware.SessionMiddleware”条目上方的 settings.MIDDLEWARE_CLASSES 中插入我的自定义中间件,则请求对象还没有 session 属性,我会收到此错误:
AttributeError: 'WSGIRequest' object has no attribute 'session'
如果我在 SessionMiddleware 条目之后插入我的中间件,则为时已晚,我会收到原始的 ORA-01461 错误。
那么,有没有办法使用中间件解决 ORA-01461 错误?或者根本没有?
请您参考如下方法:
检查此 Django 错误:https://code.djangoproject.com/ticket/11487
我也遇到了这个问题(在 Django 1.6 上)并通过将 4000 字符检查更改为 1000 here https://github.com/django/django/blob/stable/1.6.x/django/db/backends/oracle/base.py#L699 来验证它.不幸的是,因为它是 Django 核心代码,所以很难在本地修复。
我没有测试过,但 AFAICT 至少已尝试在 Django 1.7 中修复此问题 - https://github.com/django/django/blob/stable/1.7.x/django/db/backends/oracle/base.py#L781
我想如果您不能升级到 1.7(如果它确实解决了问题),您可以找到 session 数据增长过大的地方并通过将其存储在其他地方来解决 - 如果这是一个选项。
