在Django中测试数据库可访问性

时间:2014-09-26 21:19:28

标签: python django postgresql

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

我刚开始使用Django,我发现自己每次有空闲时间和笔记本电脑时都会尝试学习它是如何工作的。我发现Heroku是一个非常适合测试的地方,但是如果我等着接孩子或类似东西,我就无法上网。在开发中,我想创建一个测试,检查数据库是否可访问。如果没有,请故障转移到SQLite DB。

我开始使用从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的解决方案,那就有一半的功劳。

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

1 个答案:

答案 0 :(得分:1)

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

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

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