Hi Ioan,

I'd need to dig into the code to be 100% certain, but what you've described
seems plausible, and the fix looks like it's going in the right direction.
A ticket is certainly called for.

As for the patch -- it needs tests :-)

Django's test suite has support for testing multiple-database situations;
check the regressiontests/multiple_database test suite for examples of how
to use it. SELECT_FOR_UPDATE has it's own test suite -
modeltests/select_for_update - so the tests probably belong in there.

Yours,
Russ Magee %-)

On Mon, Feb 18, 2013 at 10:59 PM, Ioan Alexandru Cucu <
[email protected]> wrote:

> 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.
>
>
>

-- 
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