#22144 closed Bug (fixed)
Oracle Long text and bulk_create
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.6 |
Severity: | Normal | Keywords: | oracle bulk_create |
Cc: | felisiak.mariusz@… | Triage Stage: | Accepted |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I'm using django 1.6.2 + oracle 12 + cx_oracle 5.1.2
here is my model
class Value(models.Model): text= models.TextField()
I have some text and it's length is 3000 characters in Russian language, when im tring to do that:
text = 'some text' #3000 characters v = Value(text=text) v.save()
it's ok ...
but when i'm doing that:
text = 'some text' #3000 characters v = Value(text=text) Value.objects.bulk_create([v])
I got this exception:
Environment: Request Method: GET Request URL: http://127.0.0.1/test/ Django Version: 1.6.2 Python Version: 3.3.4 Installed Applications: ('django.contrib.admin', 'haystack', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'registration', 'modeltranslation', 'south', 'core', 'appl', 'legacy_data', 'djcelery') Installed Middleware: ('django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'tpp.SiteUrlMiddleWare.SiteUrlMiddleWare', 'tpp.SiteUrlMiddleWare.GlobalRequest') Traceback: File "C:\Python33\lib\site-packages\django\core\handlers\base.py" in get_response 114. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\user\PycharmProjects\tpp\tppcenter\views.py" in test 374. Value.objects.bulk_create([v]) File "C:\Python33\lib\site-packages\django\db\models\manager.py" in bulk_create 160. return self.get_queryset().bulk_create(*args, **kwargs) File "C:\Python33\lib\site-packages\django\db\models\query.py" in bulk_create 356. self._batched_insert(objs_without_pk, fields, batch_size) File "C:\Python33\lib\site-packages\django\db\models\query.py" in _batched_insert 835. using=self.db) File "C:\Python33\lib\site-packages\django\db\models\manager.py" in _insert 232. return insert_query(self.model, objs, fields, **kwargs) File "C:\Python33\lib\site-packages\django\db\models\query.py" in insert_query 1511. return query.get_compiler(using=using).execute_sql(return_id) File "C:\Python33\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 899. cursor.execute(sql, params) File "C:\Python33\lib\site-packages\django\db\backends\util.py" in execute 69. return super(CursorDebugWrapper, self).execute(sql, params) File "C:\Python33\lib\site-packages\django\db\backends\util.py" in execute 53. return self.cursor.execute(sql, params) File "C:\Python33\lib\site-packages\django\db\utils.py" in __exit__ 99. six.reraise(dj_exc_type, dj_exc_value, traceback) File "C:\Python33\lib\site-packages\django\utils\six.py" in reraise 535. raise value.with_traceback(tb) File "C:\Python33\lib\site-packages\django\db\backends\util.py" in execute 53. return self.cursor.execute(sql, params) File "C:\Python33\lib\site-packages\django\db\backends\oracle\base.py" in execute 815. return self.cursor.execute(query, self._param_generator(params)) Exception Type: DatabaseError at /test/ Exception Value: ORA-01461: can bind a LONG value only for insert into a LONG column
Attachments (1)
Change History (9)
comment:1 by , 11 years ago
comment:2 by , 11 years ago
Summary: | Oralce Long text and bulk_create → Oracle Long text and bulk_create |
---|---|
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Bug |
follow-up: 4 comment:3 by , 11 years ago
I get the same problem: my input is 2948 character long and fails with the same error. As a workaround, I applied this ugly patch:
--- a/libs/project-packages/django/db/backends/oracle/base.py +++ b/libs/project-packages/django/db/backends/oracle/base.py @@ -616,7 +616,7 @@ class OracleParam(object): if hasattr(param, 'input_size'): # If parameter has `input_size` attribute, use that. self.input_size = param.input_size - elif isinstance(param, six.string_types) and len(param) > 4000: + elif isinstance(param, six.string_types) and len(param) > 2000: # Mark any string param greater than 4000 characters as a CLOB. self.input_size = Database.CLOB else:
My django version is 1.5.5.
comment:5 by , 8 years ago
Cc: | added |
---|
I created simple test (in attachment) that fails on stable/1.6.x but passes properly on stable/1.7.x. I didn't check that carefully but probably it was fixed in b7a67b78. IMO we can resolve this ticket as fixed.
by , 8 years ago
Attachment: | 22144.diff added |
---|
comment:6 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
We could commit that test with a reference to this ticket if you think it adds value.
Hmmm... I can insert larger rando text of 10k characters ...
But if I cut the text to 3000 ( my text is 2935 characters ) then I got this exception ...
Seems like a bug in oracle segmentation algorithm when using bulk insert?