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 [email protected].
To post to this group, send email to [email protected].
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