Hi,

I wanted to raise a but around this, but I thought it might be a better 
idea to ask first on the developer's group.

If I'm running a select_for_update statement in a multidb environment that 
uses a read-only slave database, I get the following traceback:

Traceback:
File "/home/kux/workspace/src/other/django/django/core/handlers/base.py" in 
get_response
  111.                         response = callback(request, *callback_args, 
**callback_kwargs)
File "/home/kux/workspace/src/other/django/django/contrib/admin/options.py" 
in wrapper
  366.                 return self.admin_site.admin_view(view)(*args, 
**kwargs)
File "/home/kux/workspace/src/other/django/django/utils/decorators.py" in 
_wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File 
"/home/kux/workspace/src/other/django/django/views/decorators/cache.py" in 
_wrapped_view_func
  89.         response = view_func(request, *args, **kwargs)
File "/home/kux/workspace/src/other/django/django/contrib/admin/sites.py" 
in inner
  196.             return view(request, *args, **kwargs)
File "/home/kux/workspace/src/other/django/django/db/transaction.py" in 
inner
  209.                 return func(*args, **kwargs)
File "/home/kux/workspace/src/other/django-cms/cms/admin/pageadmin.py" in 
wrap
  154.             Page.objects.db_manager(router.db_for_write(Page))\
File "/home/kux/workspace/src/other/django/django/db/models/query.py" in 
exists
  562.             return self.query.has_results(using=self.db)
File "/home/kux/workspace/src/other/django/django/db/models/sql/query.py" 
in has_results
  441.         return bool(compiler.execute_sql(SINGLE))
File 
"/home/kux/workspace/src/other/django/django/db/models/sql/compiler.py" in 
execute_sql
  818.         cursor.execute(sql, params)
File "/home/kux/workspace/src/other/django/django/db/backends/util.py" in 
execute
  40.             return self.cursor.execute(sql, params)
File 
"/home/kux/workspace/src/other/django/django/db/backends/mysql/base.py" in 
execute
  114.             return self.cursor.execute(query, args)
File 
"/home/kux/workspace/envs/hb23/local/lib/python2.7/site-packages/MySQLdb/cursors.py"
 
in execute
  174.             self.errorhandler(self, exc, value)
File 
"/home/kux/workspace/envs/hb23/local/lib/python2.7/site-packages/MySQLdb/connections.py"
 
in defaulterrorhandler
  36.     raise errorclass, errorvalue

Exception Type: DatabaseError at /admin/cms/page/add/
Exception Value: (1290, 'The MySQL server is running with the --read-only 
option so it cannot execute this statement')


Looking through the source code I found that 
django.db.models.query.QuerySet.select_for_update doesn't set the 
_for_write attribute before cloning the queryset.

Is this intended behaviour?
If not, the following patch would fix the issue:

--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -663,6 +663,7 @@ class QuerySet(object):
         """
         # Default to false for nowait
         nowait = kwargs.pop('nowait', False)
+        self._for_write = True
         obj = self._clone()
         obj.query.select_for_update = True
         obj.query.select_for_update_nowait = nowait

Note: I'm running django 1.4.1

Regards,
Alex

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to