#mysql #pythonanywhere #ssh-tunnel
#mysql #pythonanywhere #ssh-туннель
Вопрос:
Я пытаюсь подключиться к базе данных MySQL, размещенной на Python в любом месте. В приведенном ниже примере connection.get_server_info()
возвращает результат, однако connection.is_connected()
возвращает False
, и я не уверен, почему.
Вот мой код:
import mysql.connector
import sshtunnel
sshtunnel.SSH_TIMEOUT = 5.0
sshtunnel.TUNNEL_TIMEOUT = 5.0
with sshtunnel.SSHTunnelForwarder(
('ssh.pythonanywhere.com'),
ssh_username='USERNAME', ssh_password='PASSWORD',
remote_bind_address=('USERNAME.mysql.pythonanywhere-services.com', 3306)
) as tunnel:
connection = mysql.connector.connect(
user='USERNAME', password='DB_PASSWORD',
host='127.0.0.1', port=tunnel.local_bind_port,
database='USERNAME$default',
)
db_info = connection.get_server_info()
if connection.is_connected():
print('Connected to MySQL DB...version on ', db_info)
else:
print('Failed to connect.')
print(db_info)
connection.close()
У меня есть платная учетная запись на Python где угодно, поэтому SSH-туннелирование должно быть возможным
Ответ №1:
Это потому, что вы пытаетесь получить доступ к SSH-туннелю после того, как он был закрыт; туннель закрывается при выходе из with
блока, поэтому все, что использует соединение, должно иметь отступ, чтобы оно содержалось в нем. Ваш приведенный выше код выглядит следующим образом:
import mysql.connector
import sshtunnel
sshtunnel.SSH_TIMEOUT = 5.0
sshtunnel.TUNNEL_TIMEOUT = 5.0
with sshtunnel.SSHTunnelForwarder(
('ssh.pythonanywhere.com'),
ssh_username='USERNAME', ssh_password='PASSWORD',
remote_bind_address=('USERNAME.mysql.pythonanywhere-services.com', 3306)
) as tunnel:
connection = mysql.connector.connect(
user='USERNAME', password='DB_PASSWORD',
host='127.0.0.1', port=tunnel.local_bind_port,
database='USERNAME$default',
)
db_info = connection.get_server_info()
if connection.is_connected():
print('Connected to MySQL DB...version on ', db_info)
else:
print('Failed to connect.')
print(db_info)
connection.close()
Комментарии:
1. Спасибо, Джайлс! Рад видеть, что это что-то настолько простое