Подключение к MySQL через Python и у меня противоречивые результаты - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь подключиться к базе данных MySQL, размещенной на Python Anywhere.В приведенном ниже примере 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 Anywhere, поэтому SSH-туннелирование должно быть возможным

1 Ответ

1 голос
/ 18 марта 2019

Это потому, что вы пытаетесь получить доступ к туннелю 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()
...