我如何检查 Django 对数据库的请求?
How can I inspect the request Django makes to a database?
我在 EC2 实例上有一个管理命令 运行,它在尝试执行 ORM 查询时失败,如下所示:
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 53, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 899, in execute_sql
raise original_exception
OperationalError: SSL connection has been closed unexpectedly
我可以从同一实例上的 django-admin shell_plus
连接到同一数据库。
为了诊断这个问题,我想检查 Django 在每种情况下发出的连接请求的参数,看看有什么不同,但是在浏览了 Django 源代码之后,似乎最好问问如何而不是而不是在杂草丛中迷路几个小时:)
也欢迎使用其他诊断策略!
根据有关 logging database queries 的文档,您应该查看数据库日志文件:
This logging does not include framework-level initialization (e.g. SET
TIMEZONE) or transaction management queries (e.g. BEGIN, COMMIT, and
ROLLBACK). Turn on query logging in your database if you wish to
view all database queries.
我已经弄清楚了:问题是这个管理命令是守护进程,数据库连接不能在 fork() 中存活,而且 Django 不够聪明,没有注意到,所以它试图使用死的连接和中断。
解决方法是
from django.db import close_old_connections
class Daemon():
def start()
self.daemonize()
close_old_connections()
我在 EC2 实例上有一个管理命令 运行,它在尝试执行 ORM 查询时失败,如下所示:
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 53, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 899, in execute_sql
raise original_exception
OperationalError: SSL connection has been closed unexpectedly
我可以从同一实例上的 django-admin shell_plus
连接到同一数据库。
为了诊断这个问题,我想检查 Django 在每种情况下发出的连接请求的参数,看看有什么不同,但是在浏览了 Django 源代码之后,似乎最好问问如何而不是而不是在杂草丛中迷路几个小时:)
也欢迎使用其他诊断策略!
根据有关 logging database queries 的文档,您应该查看数据库日志文件:
This logging does not include framework-level initialization (e.g. SET TIMEZONE) or transaction management queries (e.g. BEGIN, COMMIT, and ROLLBACK). Turn on query logging in your database if you wish to view all database queries.
我已经弄清楚了:问题是这个管理命令是守护进程,数据库连接不能在 fork() 中存活,而且 Django 不够聪明,没有注意到,所以它试图使用死的连接和中断。
解决方法是
from django.db import close_old_connections
class Daemon():
def start()
self.daemonize()
close_old_connections()