python - 从 python 连接到远程服务器中的 MySQL

标签 python mysql python-3.x pymysql

我在 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/

相关文章:

python - 如何命名以 "s"结尾的列表变量

python - 如何在所有正则表达式匹配之前/之后获取字符串的不匹配头/尾

python - mycursor.executemany UPDATE 未按预期工作

python - 将 GMT 时间戳转换为 Pandas 中的时间戳

Python 异步等待条件为真

Python Pandas 数据框 ValueError : Trying to store a string with len

python - 有没有办法在 python 中指定一个包中所有脚本都可用的 BASE_DIR 设置?

mysql - 将数据字符串排序为 int

php - 处理数据库上的同时上传

php - MySQL 高 CPU 使用率和持久链接