django之从 django 测试 postgres 数据库的可访问性
落叶无声
阅读:19
2024-10-01 17:34:08
评论:0
我正在使用带有 postgres 数据库的 django ORM。一小部分用户使用导入和导出脚本与之交互。该数据库仅在我们的 Intranet 上可用。如果有人在 postgres 不可用时尝试使用数据库,则脚本会挂起。我想让脚本在尝试处理任何数据之前测试数据库是否可用。
我可以使用 shell 连接到数据库,导入模型并尝试进行查询:
from myapp.models import mymodel
mymodel.objects.count()
这会导致很长的延迟,但随后 django 会引发
OperationalError
带有信息性消息(“无法连接到服务器:网络无法访问......”)。
我想通过对数据库进行最小查询来测试数据库访问,例如:
from django.db import connection
cursor = connection.cursor()
cursor.execute("select 1")
但这永远不会超出
cursor = connection.cursor()
线。没有错误信息。
这不是一个 Web 应用程序,所以是一个中间件解决方案 à la How do I test a database connection in Django?不可能。
编辑
按照@benjaoming 的建议,我创建了一个函数来测试连接:
import socket
def test_connection():
"""Test whether the postgres database is available. Usage:
if "--offline" in sys.argv:
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings.offline'
else:
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings.standard'
from myapp.functions.connection import test_connection
test_connection()
"""
try:
s = socket.create_connection(("example.net", 5432), 5)
s.close()
except socket.timeout:
msg = """Can't detect the postgres server. If you're outside the
intranet, you might need to turn the VPN on."""
raise socket.timeout(msg)
这似乎可以解决问题。
请您参考如下方法:
您可以使用另一种方法来确定 postgres 服务器是否可访问:例如 socket 模块 - 只需执行 socket.create_connection(("server", port)) 并查看它引发的异常......
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。