1
0
mirror of https://github.com/django/django.git synced 2025-07-05 18:29:11 +00:00

[soc2009/multidb] Raise an exception at an attempt to do a subquery with 2 different databases. Eventually we'll just evaluate the 2 queries seperates.

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/multidb@11273 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Alex Gaynor 2009-07-19 21:57:08 +00:00
parent 0536cb98d5
commit 502d4982c9
5 changed files with 20 additions and 12 deletions

View File

@ -14,12 +14,12 @@ that need to be done. I'm trying to be as granular as possible.
flush, reset, and syncdb need to not prompt the user multiple times.
3) Handle nesting of Querysets using __in across multiple dbs.
3) Handle backends with custom Query classes.
4) Handle backends with custom Query classes.
4) Wait on the merge of the m2m stuff.
5) Wait on the merge of the m2m stuff.
5) Fix django.contrib.gis, it's broken in all sorts of ways.
6) Fix django.contrib.gis, it's broken in all sorts of ways.
6) Generate SQL, instead of an error for nesting on different DBs.
7) Time permitting add support for a ``DatabaseManager``.

View File

@ -201,9 +201,9 @@ class Field(object):
if hasattr(value, 'relabel_aliases'):
return value
if hasattr(value, 'as_sql'):
sql, params = value.as_sql()
sql, params = value.as_sql(connection)
else:
sql, params = value._as_sql()
sql, params = value._as_sql(connection)
return QueryWrapper(('(%s)' % sql), params)

View File

@ -149,9 +149,9 @@ class RelatedField(object):
if hasattr(value, 'relabel_aliases'):
return value
if hasattr(value, 'as_sql'):
sql, params = value.as_sql()
sql, params = value.as_sql(connection)
else:
sql, params = value._as_sql()
sql, params = value._as_sql(connection)
return QueryWrapper(('(%s)' % sql), params)
# FIXME: lt and gt are explicitally allowed to make

View File

@ -745,12 +745,14 @@ class QuerySet(object):
self.query.add_fields(field_names, False)
self.query.set_group_by()
def _as_sql(self):
def _as_sql(self, connection):
"""
Returns the internal query's SQL and parameters (as a tuple).
"""
obj = self.values("pk")
return obj.query.as_nested_sql()
if connection.settings_dict == obj.query.connection.settings_dict:
return obj.query.as_nested_sql()
raise ValueError("Can't do subqueries with queries on different DBs.")
def _validate(self):
"""
@ -863,7 +865,7 @@ class ValuesQuerySet(QuerySet):
super(ValuesQuerySet, self)._setup_aggregate_query(aggregates)
def _as_sql(self):
def _as_sql(self, connection):
"""
For ValueQuerySet (and subclasses like ValuesListQuerySet), they can
only be used as nested queries if they're already set up to select only
@ -875,7 +877,11 @@ class ValuesQuerySet(QuerySet):
(not self._fields and len(self.model._meta.fields) > 1)):
raise TypeError('Cannot use a multi-field %s as a filter value.'
% self.__class__.__name__)
return self._clone().query.as_nested_sql()
obj = self._clone()
if connection.settings_dict == obj.query.connection.settings_dict:
return obj.query.as_nested_sql()
raise ValueError("Can't do subqueries with queries on different DBs.")
def _validate(self):
"""

View File

@ -93,3 +93,5 @@ if len(settings.DATABASES) > 1:
a.delete()
self.assertRaises(Article.DoesNotExist,
lambda: Article.objects.get(title="Django Rules!"))
self.assertRaises(ValueError,
lambda: list(Article.objects.get(pk__in=Article.objects.using('default'))))