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)) 并查看它引发的异常......


    标签:Django
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号