我在 MacOS X 10.12 上使用 Python 3.5、pymysql 0.7.6。
我正在尝试使用 python 访问远程服务器中的 MySQL 数据库。我可以使用以下命令从命令行访问:
ssh <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="98eaf7f7ecd8c0c0c0b6c0c0c0b6c0c0c0b6c0c0c0" rel="noreferrer noopener nofollow">[email protected]</a>
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="beccd1d1cafee6e6e690e6e6e690e6e6e690e6e6e6" rel="noreferrer noopener nofollow">[email protected]</a>'s password: my_server_password
然后在服务器中:
mysql my_database -p
Enter password: my_database_password
它可以工作,我可以用我的数据库做各种各样的事情。现在,我尝试在 python 中执行相同的操作,遵循文档或我在其他帖子中找到的大量示例:
import pymysql
cnx = pymysql.connect(host='XXX.XXX.XXX.XXX', port='3306', user='root', password='my_server_password', db='my_database')
它不起作用,出现错误:
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'XXX.XXX.XXX.XXX' ([Errno 61] Connection refused)")
凭据是正确的凭据,并且我已检查该端口是否是正确的端口,正如其他帖子中所建议的那样。我怀疑这可能与数据库也有密码有关,而不仅仅是服务器,但我还没有找到任何包含这两个密码的方法。事实上,我不确定连接命令中应包含哪个密码,是服务器密码还是数据库密码。它对他们都不起作用。
那么,您对这里可能存在的问题或者我是否遗漏了重要的部分有什么建议吗?
最佳答案
当您运行 mysql
命令时,您是在 SSH shell 中执行此操作。也就是说,您正在通过 localhost 连接连接到在远程计算机上运行的服务器。该远程服务器似乎没有设置为允许远程连接,仅允许来自计算机本身的连接。
您需要将 python 脚本以与您相同的方式通过 SSH 连接到 MySQL 服务器。您可以打开到远程服务器上端口 3306 的 SSH 隧道。
我喜欢用于此目的的模块是:https://pypi.python.org/pypi/sshtunnel
from sshtunnel import SSHTunnelForwarder
import pymysql
server = SSHTunnelForwarder(
'XXX.XXX.XXX.XXX',
ssh_username='root',
ssh_password='my_server_password',
remote_bind_address=('127.0.0.1', 3306)
)
server.start()
cnx = pymysql.connect(
host='127.0.0.1',
port=server.local_bind_port,
user='root',
password='my_database_password',
db='my_database'
)
# Make sure to call server.stop() when you want to disconnect
# after calling cnx.close()
关于python - 从 python 连接到远程服务器中的 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42726681/