使用Workbench将Django连接到远程MySQL数据库

时间:2017-08-10 21:06:36

标签: mysql django database ssh

我在PythonAnywhere上托管我的网站。

我在服务上有两个数据库:myusername$productionmyusername$dev

生产数据库每晚都会自行备份,并使用最新批量的实时数据加载开发数据库。我试图通过ssh将我的Django开发环境连接到dev数据库,这可能是一个付费的PythonAnywhere客户。

I followed their advice并下载了MySQL Workbench,它连接到所述数据库而没有任何问题。然后我尝试在Django中设置我的dev.py设置,如下所示:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'myusername$dev',
        'USER': 'myusername',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

然而,这会导致django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (10061)")错误。我还尝试将127.0.0.1替换为localhost,同时将主机和端口都留空,但这些都不起作用。

然后我在他们的网站上尝试了另外两个选项,也就是直接通过python代码访问数据库,以及使用Putty(我是一个Windows 10用户),但是没有这些选项有效。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:4)

PythonAnywhere dev在这里。 The help page that you link to有几种不同的选项可以从外部连接到PythonAnywhere MySQL数据库;这听起来像是 - 或者,至少,最初是 - 让第一个与第二个混淆。

首先是使用MySQL Workbench。 MySQL Workbench具有设置SSH隧道的选项,以便您可以连接到无法从公共Internet直接访问的数据库。但是,一旦您设置了该隧道,只有在MySQL Workbench中运行内容时才会有所帮助 - 它不会影响您在计算机上运行的其他代码。所以它不会帮助Django代码。

第二个选项是您希望从Python代码连接到数据库。如果您完全控制何时建立数据库连接,则可以将SSHTunnelForwarder包装器放在SQL代码周围,并且您在with语句中执行的任何SQL代码都可以连接到数据库 - 但是该声明之外的代码不会赢。因此,当你使用Django时,这并没有帮助,因为它的MySQL代码隐藏在Django库的深处,用with语句包装它将非常棘手。

第三个选项是手动设置SSH隧道,但不幸的是,这些指令针对的是Unix环境 - 例如。 Linux或Mac。当你这样做时,它启动本地机器上的服务器 - IP地址127.0.0.1,端口3306 - 接受连接,然后通过SSH转发它们,以便它们在Pythonanywhere防火墙内部出来并发送到正确的MySQL服务器。这意味着本地服务器在您的计算机上进行代码查看,就像它是MySQL服务器一样,即使它实际上只是将工作交给PythonAnywhere机器。

所以你需要做什么(看起来你几乎到了那里!)是设置PuTTY来执行Unix指令对ssh命令的操作。 These instructions几乎是你想要的;差异将是

  • " SSH网关"将是ssh.pythonanywhere.com
  • "源端口"将是3306。
  • "目的地址"到您的PythonAnywhere MySQL数据库主机的名称(来自"数据库"标签),然后是:3306