使用数据库路由器时在Django中打印SQL查询
我正在使用Django 1.8和Python 2.7。我想使用一个数据库,而不是“默认”数据库,我们可以使用所述的空白参数。让我们将该数据库称为“测试”。为了让django工作,我需要做一些路由。现在,我只是将所有内容路由到“测试”db,如下所示:使用数据库路由器时在Django中打印SQL查询,django,django-models,django-queryset,Django,Django Models,Django Queryset,我正在使用Django 1.8和Python 2.7。我想使用一个数据库,而不是“默认”数据库,我们可以使用所述的空白参数。让我们将该数据库称为“测试”。为了让django工作,我需要做一些路由。现在,我只是将所有内容路由到“测试”db,如下所示: class Router(object): def db_for_read(self, model, **hints): """ Reads go to a randomly-chosen replica.
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'),
}
}
我制作了一个简单的模型(摘自Django教程):
我现在进行/运行适当的迁移。我可以在shell中进行查询,例如
Question.objects.all()
,它返回[]
。但是,现在当我调用print Question.objects.all().query
时,它会给出一个错误,说明settings.DATABASES配置不正确。请提供引擎值。
我认为它使用的是“默认”数据库,而不是“测试”数据库。有没有办法解决这个问题以便我可以查看原始SQL查询?尝试Model.objects.using('test').all().query
您可以使用手动选择数据库。看
更新:
仅为数据库['default']
当默认值
数据库引擎
为空时,Django会在每个api函数上引发一个配置不当
异常。请参阅docstring。在allow\u migrate
中,不要返回True
,我认为您应该使用return db='test'
@RohitJain,在允许\u migrate的文档状态中执行以下操作:确定是否允许在别名为db的数据库上运行迁移操作。如果操作应该运行,则返回True;如果不应该运行,则返回False;如果路由器没有意见,则返回None。来源:是的,但是如果您总是返回True
,它也会尝试在default
db上进行迁移。我想这是错误的。嗯,我可能应该改变这一点,但我认为这与我的问题无关,因为我能够在正确的数据库上进行/应用迁移。我之所以知道这一点,是因为我能够进行一些基本的查询,例如Question.objects.all()
当使用此命令时,我会遇到相同的错误,并且切换using语句的位置没有任何区别。如果您只提供“default”的引擎值,可能会发生这种情况吗?也将其设置为sqlite3。即使没有使用
命令的,这似乎也能起作用。你知道你为什么需要它吗?文档似乎表明您不需要这样做。如果如您所说,为什么文档只给出一个空白参数的示例。Django要求定义默认数据库条目,但如果不使用参数字典,则可以将其保留为空白代码>来自
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')