Django:检测模块级数据库查询

2024-06-03 02:56:22 发布

您现在位置:Python中文网/ 问答频道 /正文

模块级的数据库查询(又称导入时)在django中可能会造成麻烦。你知道吗

见:https://groups.google.com/forum/#!topic/django-developers/7JwWatLfP44/discussion

麻烦:

  • 真正的数据库是在测试中访问的,而不是在测试数据库中。你知道吗
  • 猴子修补应用程序内就绪信号为时已晚
  • 。。。你知道吗

如何在app ready信号出现之前检测访问数据库的特定python源代码行?你知道吗


Tags: 模块djangohttpscom数据库应用程序topic信号
1条回答
网友
1楼 · 发布于 2024-06-03 02:56:22

我找到了解决办法。很“脏”,但很管用。你知道吗

如果将assert 0添加到django/db/backends/postgresql/base.pyget_new_connection

然后你会看到一个很长的回溯。它揭示了你在哪里访问数据库太早了。你知道吗

当然,您应该只在您的开发环境中这样做。你知道吗

我想对于sqlite也应该如此。你知道吗

foobar_vums_d@aptguettler:~$ py.test -k ...
Traceback (most recent call last):
  File "/home/foobar_vums_d/bin/py.test", line 11, in <module>
    sys.exit(main())
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/_pytest/config.py", line 49, in main
    return config.hook.pytest_cmdline_main(config=config)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 724, in __call__
    return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 338, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 333, in <lambda>
    _MultiCall(methods, kwargs, hook.spec_opts).execute()
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/_pytest/vendored_packages/pluggy.py", line 596, in execute
    res = hook_impl.function(*args)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/pytest_djangotools/hooks.py", line 46, in pytest_cmdline_main
    import consolescript_django
  File "/home/foobar_vums_d/src/djangotools/consolescript_django/__init__.py", line 11, in <module>
    django.setup()
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/apps/registry.py", line 115, in populate
    app_config.ready()
  File "/home/foobar_vums_d/src/djangotools/djangotools/apps.py", line 19, in ready
    url_patterns = get_resolver(None).url_patterns
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 417, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 410, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/foobar_vums_d/src/foobar-vums/foobar_vums/etc/rooturls.py", line 11, in <module>
    urlpatterns = collect_urlpatterns_from_apps()
  File "/home/foobar_vums_d/src/djangotools/djangotools/utils/urlresolverutils.py", line 124, in collect_urlpatterns_from_apps
    urls_module = importlib.import_module(app_import_string + '.urls')
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/foobar_vums_d/src/foobar/foobar/urls.py", line 310, in <module>
    urlpatterns.append(url(r'^', include(collect_urlpatterns_from_package(views))))
  File "/home/foobar_vums_d/src/djangotools/djangotools/utils/urlresolverutils.py", line 94, in collect_urlpatterns_from_package
    import_package(views_package)
  File "/home/foobar_vums_d/src/djangotools/djangotools/utils/urlresolverutils.py", line 89, in import_package
    importlib.import_module(module_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/foobar_vums_d/src/foobar/foobar/views/issue/legacy_edit2.py", line 55, in <module>
    for index in Index.objects.all():
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/models/query.py", line 258, in __iter__
    self._fetch_all()
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/models/query.py", line 1074, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/models/query.py", line 52, in __iter__
    results = compiler.execute_sql()
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 846, in execute_sql
    cursor = self.connection.cursor()
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 231, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 204, in _cursor
    self.ensure_connection()
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 199, in ensure_connection
    self.connect()
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 171, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/home/foobar_vums_d/local/lib/python2.7/site-packages/django/db/backends/postgresql/base.py", line 175, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/usr/lib/python2.7/dist-packages/psycopg2/__init__.py", line 105, in connect
    assert 0
AssertionError

在本例中,buggy行位于src/foobar/foobar/views/issue/legacy_edit2.py

您可以通过从下到上遍历堆栈,跳过所有包含/site-packages/django/的行来找到它。你知道吗

相关问题 更多 >