【问题标题】:Cant see SQL queries with multiple database landscape看不到具有多个数据库环境的 SQL 查询
【发布时间】:2019-02-12 06:18:36
【问题描述】:

Django 2.1.7,MySQL。 DATABASES 配置如下:

DATABASES = {
    'default': {},
    'auth_db': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'auth',
        ...
    },
    'db1': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'db1',
        ...
    },
    'db2': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'd2',
        ...
    }
}

我在查看原始 SQL 查询时遇到各种问题:

1) 无法打印特定查询集的查询:

qs = Model.objects.using("db2").filter(...)
print(qs.query)

此代码丢弃ImproperlyConfigured,因为它不尊重.using("db2"),并且不知何故检查默认数据库是空的(如django docs中所述,空的default_db很好)

2) 在运行时我打开一个 shell 来监控查询:

from django.db import connections
print(connections["db1"].queries)

我只看到这个:

[{'sql': 'None', 'time': '0.001'},
 {'sql': 'None', 'time': '0.000'},
 {'sql': 'None', 'time': '0.008'}]

debug=True 的设置如文档中所述。

有没有人遇到过这种多数据库问题的经验?

编辑: 如文档中所述,我的数据库路由器配置良好。在运行时一切都很好,但出于调试目的,我当然需要一个 shell 来手动测试不同数据库中的查询集。

【问题讨论】:

    标签: django django-queryset multiple-databases


    【解决方案1】:

    我知道这是一个有点老的话题。但是即使您设置了调试,但您的示例显示了带有过滤器的查询。你实际上并没有称之为(懒惰)。这就是您的查询为无的原因。

    from django.db import connections
    from django.conf import settings
    
    
    settings.DEBUG = True
    qs = Model.objects.using('mydb').filter()
    # still none
    print(connections['mydb'].queries)
    
    # example triggering the query
    foo = len(objects) # don't call .count() because then query changes
    # or example go through it
    for o in objects:
        pass
        # do something
    
    # now your query and time is seen
    print(connections['mydb'].queries)
       
    

    【讨论】:

      【解决方案2】:

      DATABASES 设置必须配置一个默认数据库;任意数量的 也可以指定其他数据库。

      我从database doc 找到这个。所以你不能将default 设置为空。所以你必须通过插入虚拟数据来设置默认值。

      如果你解决了第一个问题但第二个问题仍然存在,请告诉我。

      编辑:

      如果默认数据库的概念在上下文中没有意义 在您的项目中,您需要注意始终指定数据库 你想使用的。 Django 要求默认数据库条目是 已定义,但参数字典可以留空 不被使用。为此,您必须为所有 您的应用程序的模型,包括任何 contrib 和第三方应用程序中的模型 您正在使用,因此没有查询被路由到默认数据库。 下面是一个示例 settings.py sn -p 定义了两个 非默认数据库,有意留下默认条目 空:

      来自this doc。 所以你需要配置DATABASE_ROUTERS

      【讨论】:

      • 谢谢,不过好像不是你说的那样。请阅读:docs.djangoproject.com/en/2.1/topics/db/multi-db。 “Django 要求定义一个默认数据库条目,但如果不使用参数字典,则可以将其留空。”我在我的问题中指出了这一点......
      • 我的数据库路由器配置正确。我已在第一篇文章中添加了此信息。
      • 你能发布你的数据库路由器代码和settings.py吗? @AlexeyTrofimov
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多