首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-ORM连接在每次查询之前刷新

Django-ORM连接在每次查询之前刷新
EN

Stack Overflow用户
提问于 2022-04-12 15:57:26
回答 1查看 302关注 0票数 0

我的python模块之一(虽然与Django应用程序没有直接关联)应该使用Django模型(属于原始Django应用程序)通过Django-ORM进行方便的DB查询。但是,只有在出现DB或站点到站点连接问题之前,这才能正常工作。

按以下步骤复制100%:

  1. 通过在任何python模块

中设置Django创建模型.

  • 导入模型

代码语言:javascript
复制
 os.environ['DJANGO_SETTINGS_MODULE'] = 'ServiceName.settings'
 django.setup()
 from ServiceName.models import ModelName

  1. 通过django使用模型在服务启动时从DB中获取一些数据(让我们称之为步骤1),稍后通过一些触发器(让我们称之为步骤2)。在我的例子中,数据是在启动时获取一次,然后在某些Kafka事件上获取所有后续的时间。例如

query_results = ModelName.objects.filter(your_filter=some_value)

4.在第一步之后关闭PostgreSQL实例,但在第二步之前不确定是否与该问题有关,但我们使用pg-保镖作为连接点。

5.启动PostgreSQL,触发step2。

首先,获取数据的attemp在以下跟踪中失败:

代码语言:javascript
复制
Traceback (most recent call last):
File "/opt/services/_init_.py", line 113, in observe_events
if callback(event):
File "services_logparser_core.py", line 193, in process_event
r_handler.update_rules()
File "services_logparser_core.py", line 48, in update_rules
self.rules_list = self._fetch_enabled_rules()
File "services_logparser_core.py", line 69, in _fetch_enabled_rules
for sr in enabled_search_rules:
File "/usr/local/lib/python3.8/dist-packages/django/db/models/query.py", line 280, in _iter_
self._fetch_all()
File "/usr/local/lib/python3.8/dist-packages/django/db/models/query.py", line 1324, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/usr/local/lib/python3.8/dist-packages/django/db/models/query.py", line 51, in _iter_
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "/usr/local/lib/python3.8/dist-packages/django/db/models/sql/compiler.py", line 1175, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python3.8/dist-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/usr/local/lib/python3.8/dist-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/usr/local/lib/python3.8/dist-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/dist-packages/django/db/utils.py", line 90, in _exit_
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.8/dist-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
django.db.utils.OperationalError: SSL SYSCALL error: EOF detected

随后所有获取数据的尝试都失败了,原因如下:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/opt/services/__init__.py", line 113, in observe_events
    if callback(event):
  File "services_logparser_core.py", line 193, in process_event
    r_handler.update_rules()
  File "services_logparser_core.py", line 48, in update_rules
    self.rules_list = self._fetch_enabled_rules()
  File "services_logparser_core.py", line 69, in _fetch_enabled_rules
    for sr in enabled_search_rules:
  File "/usr/local/lib/python3.8/dist-packages/django/db/models/query.py", line 280, in __iter__
    self._fetch_all()
  File "/usr/local/lib/python3.8/dist-packages/django/db/models/query.py", line 1324, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.8/dist-packages/django/db/models/query.py", line 51, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/usr/local/lib/python3.8/dist-packages/django/db/models/sql/compiler.py", line 1173, in execute_sql
    cursor = self.connection.cursor()
  File "/usr/local/lib/python3.8/dist-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/dist-packages/django/db/backends/base/base.py", line 259, in cursor
    return self._cursor()
  File "/usr/local/lib/python3.8/dist-packages/django/db/backends/base/base.py", line 237, in _cursor
    return self._prepare_cursor(self.create_cursor(name))
  File "/usr/local/lib/python3.8/dist-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.8/dist-packages/django/db/backends/base/base.py", line 237, in _cursor
    return self._prepare_cursor(self.create_cursor(name))
  File "/usr/local/lib/python3.8/dist-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/dist-packages/django/db/backends/postgresql/base.py", line 236, in create_cursor
    cursor = self.connection.cursor()
django.db.utils.InterfaceError: connection already closed

应用程序重新启动修复了问题。

我没有在任何地方手动设置到数据库的连接(我只设置了db凭据),所有的连接都由Django ORM处理。在项目中是否可以配置任何django/psycopg设置,以便每次需要db查询时都建立新的连接?

Django==3.2.6

EN

回答 1

Stack Overflow用户

发布于 2022-04-20 09:55:55

代码语言:javascript
复制
from django import db

代码语言:javascript
复制
db.close_old_connections()

在此之前

代码语言:javascript
复制
query_results = ModelName.objects.filter(your_filter=some_value)

成功了。close_old_connections()方法不仅关闭旧连接,还检查当前连接是否仍然可用。如果连接返回错误,它将被关闭。新连接自动打开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71845791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档