However, when trying to print a query with something like:
{{{
print Question.objects.all().query
}}}
you get the error that
{{{
settings.DATABASES is improperly configured. Please supply the ENGINE
value.
}}}
even though the query itself can return results.
You can replicate this by creating a new project, creating a router that
routes everything to a test database like so:
{{{
class Router(object):
def db_for_read(self, model, **hints):
"""
Reads go to a randomly-chosen replica.
"""
return 'test'
def db_for_write(self, model, **hints):
"""
Writes always go to primary.
"""
return 'test'
def allow_relation(self, obj1, obj2, **hints):
"""
Relations between objects are allowed if both objects are
in the primary/replica pool.
"""
return True
def allow_migrate(self, db, app_label, model=None, **hints):
"""
All non-auth models end up in this pool.
"""
return True
# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASE_ROUTERS = ['test123.settings.Router']
DATABASES = {
'default': {},
'test': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
}}}
Create a simple model like this one:
{{{
from django.db import models
# Create your models here.
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
}}}
and run the appropriate migrations on the test database.
Then attempting to print the query will fail, but the query itself will
work. I believe the error is because the sql_with_params method in
django.db.models.sql.query forces the uses of the DEFAULT_DB_ALIAS:
{{{
def sql_with_params(self):
"""
Returns the query as an SQL string and the parameters that will be
substituted into the query.
"""
return self.get_compiler(DEFAULT_DB_ALIAS).as_sql()
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/25947>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* component: Uncategorized => Database layer (models, ORM)
* needs_tests: => 0
* needs_docs: => 0
* type: Uncategorized => Bug
* stage: Unreviewed => Accepted
Old description:
New description:
{{{
from django.db import models
--
Comment:
I guess this might be tricky to fix for reasons similar to this comment in
the file: "We need to use DEFAULT_DB_ALIAS here, as QuerySet does not have
(nor should it have) knowledge of which connection is going to be used."
--
Ticket URL: <https://code.djangoproject.com/ticket/25947#comment:1>
Comment (by liboz):
I looked into this a bit and Django seems to crash when running
`quote_name_unless_alias` in `django.db.models.sql.compiler` because it
uses DatabaseOperations' `quote_name` function. Could changing the
DatabaseOperations for `django.db.backends.dummy` to have a `quote_name`
function like that of sqlite?
I'm thinking of something like:
{{{
def quote_name(self, name):
if name.startswith('"') and name.endswith('"'):
return name # Quoting once is enough.
return '"%s"' % name
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/25947#comment:2>
* cc: Egor R (added)
--
Ticket URL: <https://code.djangoproject.com/ticket/25947#comment:3>
* owner: nobody => Teddy Ni
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/25947#comment:4>
* has_patch: 0 => 1
Comment:
Patch is provided in https://github.com/django/django/pull/15142.
--
Ticket URL: <https://code.djangoproject.com/ticket/25947#comment:5>
* needs_better_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/25947#comment:6>