我正在尝试在python和我的MySQL数据库(在AWS中)之间建立连接。
SSH隧道工作正常,如果此事与之后开始与数据库的连接有关,则会发生问题。这是我的代码:
从sqlalchemy导入create_engine 从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,“无法通过db-url连接到MySQL服务器
在创建跳转主机之前,连接字符串可以正常工作。
答案 0 :(得分:0)
使用以下语句:
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-host 上建立到ssh服务器的SSH隧道,并指示远程隧道终结点连接到在 database-host 在端口 db-port 上(例如3306)。但是要注意的重要一点是,仅在客户端建立连接后才建立此隧道。
但是,您可能会问客户端如何建立连接?好吧,SSHTunnelForwarder的部分功能是它侦听本地主机上随机端口上的连接。因此,当您使用客户端应用程序连接到localhost时(这就是 create_engine()和 engine.connect()调用中发生的情况),SSH隧道将从其中读取数据该连接,将其推过隧道,然后将其传递到隧道那侧的远程端点(即,位于database-host:db-port的数据库服务器)。
因此,您在代码中缺少的是数据库连接应以localhost为目标,如下所示(您应该能够使用IP地址127.0.0.1或主机名 localhost ) :
engine = create_engine("mysql+pymysql://db-username:db-pw@127.0.0.1:"+port+"/dbname",encoding='latin1', echo=True, pool_recycle=280)