Opened 10 years ago

Closed 7 years ago

Last modified 7 years ago

#22144 closed Bug (fixed)

Oracle Long text and bulk_create

Reported by: artur@… 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)

22144.diff (1.1 KB ) - added by Mariusz Felisiak 7 years ago.

Download all attachments as: .zip

Change History (9)

comment:1 by artur@…, 10 years ago

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?

comment:2 by Daniele Procida, 10 years ago

Summary: Oralce Long text and bulk_createOracle Long text and bulk_create
Triage Stage: UnreviewedAccepted
Type: UncategorizedBug

comment:3 by anonymous, 10 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.

in reply to:  3 comment:4 by aurelien.scoubeau+trac@…, 10 years ago

Replying to myself to give a name.

comment:5 by Mariusz Felisiak, 7 years ago

Cc: felisiak.mariusz@… 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 Mariusz Felisiak, 7 years ago

Attachment: 22144.diff added

comment:6 by Tim Graham, 7 years ago

Resolution: fixed
Status: newclosed

We could commit that test with a reference to this ticket if you think it adds value.

comment:7 by Mariusz Felisiak, 7 years ago

I think it's worth doing (PR).

comment:8 by Tim Graham <timograham@…>, 7 years ago

In dc811cf5:

Refs #22144 -- Added test for QuerySet.bulk_create() with long non-ASCII text.

Note: See TracTickets for help on using tickets.
Back to Top