Opened 10 years ago
Last modified 16 months ago
#25947 assigned Bug
Query's str() method fails when 'default' database is empty — at Version 1
| Reported by: | liboz | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Egor R | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | yes |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
According to the docs, we can have
default database...[with]...parameters dictionary...blank if it will not be used.
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()
Change History (1)
comment:1 by , 10 years ago
| Component: | Uncategorized → Database layer (models, ORM) |
|---|---|
| Description: | modified (diff) |
| Summary: | Query's str() method fails when default Database has no parameters → Query's str() method fails when 'default' database is empty |
| Triage Stage: | Unreviewed → Accepted |
| Type: | Uncategorized → Bug |
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."