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:
parent
0536cb98d5
commit
502d4982c9
8
TODO.txt
8
TODO.txt
@ -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.
|
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``.
|
7) Time permitting add support for a ``DatabaseManager``.
|
||||||
|
@ -201,9 +201,9 @@ class Field(object):
|
|||||||
if hasattr(value, 'relabel_aliases'):
|
if hasattr(value, 'relabel_aliases'):
|
||||||
return value
|
return value
|
||||||
if hasattr(value, 'as_sql'):
|
if hasattr(value, 'as_sql'):
|
||||||
sql, params = value.as_sql()
|
sql, params = value.as_sql(connection)
|
||||||
else:
|
else:
|
||||||
sql, params = value._as_sql()
|
sql, params = value._as_sql(connection)
|
||||||
return QueryWrapper(('(%s)' % sql), params)
|
return QueryWrapper(('(%s)' % sql), params)
|
||||||
|
|
||||||
|
|
||||||
|
@ -149,9 +149,9 @@ class RelatedField(object):
|
|||||||
if hasattr(value, 'relabel_aliases'):
|
if hasattr(value, 'relabel_aliases'):
|
||||||
return value
|
return value
|
||||||
if hasattr(value, 'as_sql'):
|
if hasattr(value, 'as_sql'):
|
||||||
sql, params = value.as_sql()
|
sql, params = value.as_sql(connection)
|
||||||
else:
|
else:
|
||||||
sql, params = value._as_sql()
|
sql, params = value._as_sql(connection)
|
||||||
return QueryWrapper(('(%s)' % sql), params)
|
return QueryWrapper(('(%s)' % sql), params)
|
||||||
|
|
||||||
# FIXME: lt and gt are explicitally allowed to make
|
# FIXME: lt and gt are explicitally allowed to make
|
||||||
|
@ -745,12 +745,14 @@ class QuerySet(object):
|
|||||||
self.query.add_fields(field_names, False)
|
self.query.add_fields(field_names, False)
|
||||||
self.query.set_group_by()
|
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).
|
Returns the internal query's SQL and parameters (as a tuple).
|
||||||
"""
|
"""
|
||||||
obj = self.values("pk")
|
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):
|
def _validate(self):
|
||||||
"""
|
"""
|
||||||
@ -863,7 +865,7 @@ class ValuesQuerySet(QuerySet):
|
|||||||
|
|
||||||
super(ValuesQuerySet, self)._setup_aggregate_query(aggregates)
|
super(ValuesQuerySet, self)._setup_aggregate_query(aggregates)
|
||||||
|
|
||||||
def _as_sql(self):
|
def _as_sql(self, connection):
|
||||||
"""
|
"""
|
||||||
For ValueQuerySet (and subclasses like ValuesListQuerySet), they can
|
For ValueQuerySet (and subclasses like ValuesListQuerySet), they can
|
||||||
only be used as nested queries if they're already set up to select only
|
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)):
|
(not self._fields and len(self.model._meta.fields) > 1)):
|
||||||
raise TypeError('Cannot use a multi-field %s as a filter value.'
|
raise TypeError('Cannot use a multi-field %s as a filter value.'
|
||||||
% self.__class__.__name__)
|
% 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):
|
def _validate(self):
|
||||||
"""
|
"""
|
||||||
|
@ -93,3 +93,5 @@ if len(settings.DATABASES) > 1:
|
|||||||
a.delete()
|
a.delete()
|
||||||
self.assertRaises(Article.DoesNotExist,
|
self.assertRaises(Article.DoesNotExist,
|
||||||
lambda: Article.objects.get(title="Django Rules!"))
|
lambda: Article.objects.get(title="Django Rules!"))
|
||||||
|
self.assertRaises(ValueError,
|
||||||
|
lambda: list(Article.objects.get(pk__in=Article.objects.using('default'))))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user