【问题标题】:Test database accessibility in Django在 Django 中测试数据库可访问性
【发布时间】:2014-09-26 21:19:28
【问题描述】:

我的问题与this问题非常相似

我刚刚开始使用 Django,我发现自己只要有空闲时间和我的笔记本电脑可用,就试图了解它是如何工作的。我发现 Heroku 是测试事物的好地方,但如果我在等待接孩子或类似的事情,我就不能总是上网。在开发中,我想创建一个测试来检查数据库是否可访问。如果没有,请故障转移到 SQLite 数据库。

我从大量借用 here 的代码开始:

def pingable(hostname):
    try:
        return os.system("ping -c 1 " + hostname  + " > /dev/null 2>&1") == 0
    except:
        return False

if (not pingable(DATABASES['default']['HOST'])):
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

我只是在设置 DATABASES 变量后立即执行该代码。但这有一些弱点。最明显的是 AWS(Heroku 使用)不会响应 ping,除非您特别启用它们。 . .老实说,如果您不必这样做,为什么要让事情变得不那么安全?

因此,为了不重新发明轮子,这让我提出了这个问题:是否有人创建了一种方法来检查 Django DB 是否可访问?

我真的只需要检查 Postgres 。 . .但我真的很想找到一个通用的解决方案,如果你能指出一个只适用于 Postgres 的解决方案,那么一半功劳。

编辑:澄清一下,互联网本身可能可用,但必要的端口可能被防火墙阻止。 . .很难知道会有什么可用

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    这并不是管理 Heroku 和本地开发机器之间的数据库设置的真正方法。

    Heroku 通过环境变量管理所有这些类型的设置,这是12-factor app 的原则之一。他们还制作了一个 Django 库,dj-database-url,它可以读取这些环境变量并自动适当地配置设置。

    您应该将它用于您的数据库设置,然后您可以使用本地 sqlite3 数据库的地址设置本地环境变量DATABASE_URL。然后,您的应用将自动在开发和生产环境中运行,并自行配置为自动指向相关数据库。

    【讨论】:

    • OP 的问题是如何让它根据可用性自动检测要连接的数据库。你的答案是他应该忘记这一点并使用环境变量手动配置吗?
    • 我不相信这实际上解决了我关于根据可用性进行选择的问题。
    • 我想丹尼尔在这里的回答是要走的路。自动故障转移的想法很好,但pingable() 只会在您启动线程时调用一次。如果您想在每次设置与数据库的连接时都运行此函数,那么事情会变得非常缓慢。
    • @Bjorn:这真的不是问题,因为这是我们正在谈论的仅用于开发的环境。与您可能只有一分钟的时间来编辑设置相比,稍微慢一点是一个小得多的问题。
    猜你喜欢
    • 2011-11-24
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2020-12-30
    • 2018-11-02
    • 2010-09-11
    • 2019-02-06
    相关资源
    最近更新 更多