我在PythonAnywhere上托管我的网站。
我在服务上有两个数据库:myusername$production
和myusername$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用户),但是没有这些选项有效。
非常感谢任何建议。
答案 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.pythonanywhere.com
:3306
。