Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python 3通过SSH(通过跳转主机)连接到MySQL数据库_Python_Sqlalchemy_Ssh Tunnel - Fatal编程技术网

使用python 3通过SSH(通过跳转主机)连接到MySQL数据库

使用python 3通过SSH(通过跳转主机)连接到MySQL数据库,python,sqlalchemy,ssh-tunnel,Python,Sqlalchemy,Ssh Tunnel,我正在尝试在python和我的MySQL数据库(在AWS中)之间建立连接 SSH隧道工作正常,如果是关于在之后启动到数据库的连接,则会发生问题。这是我的密码: tunnel = SSHTunnelForwarder( ('ssh-host', 22), ssh_pkey="my-keypair", ssh_username="my-user", ssh_password="my-pw", remote_bind_address=('database-hos

我正在尝试在python和我的MySQL数据库(在AWS中)之间建立连接

SSH隧道工作正常,如果是关于在之后启动到数据库的连接,则会发生问题。这是我的密码:

tunnel = SSHTunnelForwarder(
    ('ssh-host', 22),
    ssh_pkey="my-keypair",
    ssh_username="my-user",
    ssh_password="my-pw",
    remote_bind_address=('database-host', db-port)
    )

tunnel.start()
print("SSH connection created..")   #until here it works fine.
port = str(tunnel.local_bind_port)
engine = create_engine("mysql+pymysql://db-username:db-pw@db-url"+port+"/dbname",encoding='latin1', echo=True, pool_recycle=280)
connection = engine.connect()
从sqlalchemy导入创建引擎 从sshtunnel导入SSHTunnelForwarder

这是我的密码:

tunnel = SSHTunnelForwarder(
    ('ssh-host', 22),
    ssh_pkey="my-keypair",
    ssh_username="my-user",
    ssh_password="my-pw",
    remote_bind_address=('database-host', db-port)
    )

tunnel.start()
print("SSH connection created..")   #until here it works fine.
port = str(tunnel.local_bind_port)
engine = create_engine("mysql+pymysql://db-username:db-pw@db-url"+port+"/dbname",encoding='latin1', echo=True, pool_recycle=280)
connection = engine.connect()
尝试连接到数据库后,显示以下错误:

sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2003,“无法连接到数据库url上的MySQL服务器。”

在创建跳转主机之前,连接字符串工作正常。

使用以下语句:

tunnel = SSHTunnelForwarder(
    ('ssh-host', 22),
    ssh_pkey="my-keypair",
    ssh_username="my-user",
    ssh_password="my-pw",
    remote_bind_address=('database-host', db-port)
    )
在端口22的SSH主机上为SSH服务器建立SSH隧道,并指示远程隧道端点连接到在端口db端口(例如3306)的数据库主机上运行的数据库服务器。但需要注意的要点是,此隧道仅在客户端建立连接后建立

但您可能会问,客户端是如何建立连接的?SSHTunnelForwarder的部分功能是侦听本地主机上随机端口上的连接。因此,当您使用客户端应用程序连接到本地主机时(这是在create_engine()和engine.connect()调用中发生的情况),SSH隧道将从该连接读取数据,将其推送到隧道的另一端,并将其传递到隧道另一端的远程端点(即数据库主机上的数据库服务器:db端口)

因此,代码中缺少的是数据库连接应该以localhost为目标,如下所示(您应该能够使用IP地址127.0.0.1或主机名localhost):


我假设您使用localhost作为db url,因为我不知道为什么您觉得有必要在上面的示例中混淆它?另外,远程绑定地址字段的数据库主机是什么,是localhost吗?1)不,它不是我的本地主机。它引用了AWS中当前数据库的url。因此,亚马逊的RDS服务。2)数据库主机的值与db url相同。一个引用AWS中数据库的url。它不是从我这边完全选择的名称。我应该给它们一个唯一的名称,但它应该是本地主机,对吗?我明白了远程绑定地址应该是AWS数据库主机,但是当您在create\u引擎调用中连接时,db\u url应该是localhost。这就是SSH隧道转发器的要点,它监听您的环回地址,当您连接到它时,它会将您的连接隧道到隧道另一端运行的数据库服务器。就是这样。现在它工作了,谢谢!