С этим оператором:
tunnel = SSHTunnelForwarder(
('ssh-host', 22),
ssh_pkey="my-keypair",
ssh_username="my-user",
ssh_password="my-pw",
remote_bind_address=('database-host', db-port)
)
SSH-туннель установлен на ssh-host на порту 22, и удаленная конечная точка туннеля получает указание подключиться к базе данных. сервер работает на база данных-хост на порт db-порт (например, 3306). Но важно отметить, что этот туннель устанавливается только после того, как клиент установит соединение.
Но как клиент устанавливает соединение, спросите вы? Ну, часть функциональности SSHTunnelForwarder заключается в том, что он прослушивает соединения через случайный порт на локальном хосте. Поэтому, когда вы подключаетесь к localhost с помощью клиентского приложения (это происходит при вызовах create_engine () и engine.connect () ), SSH-туннель будет считывать данные из этого подключения. протолкните его через туннель и доставьте его на удаленную конечную точку на той стороне туннеля (т. е. сервер базы данных на хосте базы данных: db-порт).
Итак, что вам не хватает в вашем коде, так этосоединение с базой данных должно быть нацелено на 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)