после подключения к удаленной базе данных скрипт не завершается - PullRequest
0 голосов
/ 02 октября 2018

Я подключаюсь к удаленной базе данных.Я использую sshtunnel для этого.У меня нет проблем подключиться к БД и получить доступ к данным.

Моя проблема в том, что мой скрипт не завершается после всего.Я создаю соединение, загружаю данные, печатаю данные, останавливаю соединение ssh, печатаю «выход».Этот скрипт перестал работать в строке server.stop () и не выводит «stop».Мне нужно прервать его, чтобы перестать работать этот код.

Это код:

from sshtunnel import SSHTunnelForwarder
from sqlalchemy import create_engine
import pandas as pd


server = SSHTunnelForwarder(
    ('host', 22),
    ssh_password='password',
    ssh_username='username',
    remote_bind_address=('127.0.0.1', 3306)
)
server.start()

engine = create_engine(
    'mysql+mysqldb://db_user:db_pass@127.0.0.1:{}/temps'.format(server.local_bind_port))

query = 'SELECT * FROM temp'

df = pd.read_sql(query, engine)
print(df.head())
print(df.tail())

server.stop()
print('stop')

Этот скрипт не выводит 'stop'.

Вопрос: почему этокод не может перестать работать?

РЕДАКТИРОВАТЬ:

Я добавил

trace_logger = create_logger (loglevel = "TRACE")

После этого я замечаю что-то интересное.Код с передачей данных не содержит одной строки: Транспорт закрыт.Я проверил свой код без отправки SQL-запроса, и скрипт правильно завершил.

журналы с передачей данных

2018-10-07 18:41:43,274| WAR | MainThrea/0967@sshtunnel | Could not read SSH configuration file: ~/.ssh/config
2018-10-07 18:41:43,275| INF | MainThrea/0993@sshtunnel | 0 keys loaded from agent
2018-10-07 18:41:43,275| INF | MainThrea/1042@sshtunnel | 0 keys loaded from host directory
2018-10-07 18:41:43,275| INF | MainThrea/0914@sshtunnel | Connecting to gateway: 192.168.0.102:22 as user ‘xxx’
2018-10-07 18:41:43,275| DEB | MainThrea/0917@sshtunnel | Concurrent connections allowed: True
2018-10-07 18:41:43,275| DEB | MainThrea/1369@sshtunnel | Trying to log in with password: xxx
2018-10-07 18:41:43,600| INF | Srv-56620/1389@sshtunnel | Opening tunnel: 0.0.0.0:56620 <> 127.0.0.1:3306
….. # data transfer
2018-10-07 18:41:43,945| INF | MainThrea/1328@sshtunnel | Closing all open connections...
<Logger sshtunnel.SSHTunnelForwarder (TRACE)>
2018-10-07 18:41:43,945| DEB | MainThrea/1332@sshtunnel | Listening tunnels: 0.0.0.0:56620
2018-10-07 18:41:43,945| INF | MainThrea/1408@sshtunnel | Shutting down tunnel ('0.0.0.0', 56620)
2018-10-07 18:41:44,048| INF | Srv-56620/1395@sshtunnel | Tunnel: 0.0.0.0:56620 <> 127.0.0.1:3306 released

журналы без передачи данных

2018-10-07 18:37:54,016| WAR | MainThrea/0967@sshtunnel | Could not read SSH configuration file: ~/.ssh/config
2018-10-07 18:37:54,017| INF | MainThrea/0993@sshtunnel | 0 keys loaded from agent
2018-10-07 18:37:54,017| INF | MainThrea/1042@sshtunnel | 0 keys loaded from host directory
2018-10-07 18:37:54,017| INF | MainThrea/0914@sshtunnel | Connecting to gateway: 192.168.0.102:22 as user ‘xxx'
2018-10-07 18:37:54,017| DEB | MainThrea/0917@sshtunnel | Concurrent connections allowed: True
2018-10-07 18:37:54,017| DEB | MainThrea/1369@sshtunnel | Trying to log in with password: xxx
2018-10-07 18:37:54,342| INF | Srv-56560/1389@sshtunnel | Opening tunnel: 0.0.0.0:56560 <> 127.0.0.1:3306
2018-10-07 18:37:54,363| INF | MainThrea/1328@sshtunnel | Closing all open connections...
<Logger sshtunnel.SSHTunnelForwarder (TRACE)>
2018-10-07 18:37:54,363| DEB | MainThrea/1332@sshtunnel | Listening tunnels: 0.0.0.0:56560
2018-10-07 18:37:54,363| INF | MainThrea/1408@sshtunnel | Shutting down tunnel ('0.0.0.0', 56560)
2018-10-07 18:37:54,448| INF | Srv-56560/1395@sshtunnel | Tunnel: 0.0.0.0:56560 <> 127.0.0.1:3306 released
2018-10-07 18:37:54,448| DEB | MainThrea/1422@sshtunnel | Transport is closed

Ответы [ 2 ]

0 голосов
/ 20 июля 2019

Просто хочу добавить это, если у кого-то есть такая же проблема, где engine.dispose() не работает.Я на Windows Python 3.7.Мне потребовались часы, чтобы найти решение

, выдавшее server.daemon_forward_servers = True, прежде чем server.start() устранило проблему для меня.

Больше ссылок здесь: https://github.com/pahaz/sshtunnel/issues/138

0 голосов
/ 08 октября 2018

После проверки журнала выясняется, что проблема была в sqlalchemy открытых соединениях.

Мы создали trace_logger = sshtunnel.create_logger(loglevel="TRACE") и передали его SSHTunnelForwarder

Кому-нибудь для дальнейшего использования:

Добавление engine.dispose() после df.read_sql закроет все зависшие соединения с базой данных, позволяя закрыть ssh-туннель.

Соответствующая документация из sqlalchemy

...