2017-01-05 28 views
0

設定後:ローカルのWindowsマシンで、SpyderをPython 3.5で実行します。さらに、MariaDBを備えたリモートUbuntuサーバを持っています。私がしたいのは、SSHトンネルとsqlalchemyを使ってデータベースからSpyderにデータをロードすることです。 SSHトンネルを使用してリモートサーバー上のMariaDBからデータを読み取る

私が探しています2つのソリューション

は以下のとおりです。

(I)サーバーへのSSHトンネルの使用のPuTTY hereを説明し、その後、スパイダーのように:

import mysql.connector 
from sqlalchemy import create_engine 

import pandas as pd 

engine = create_engine('mysql+mysqlconnector://un_db:[email protected]/db') 
dbconn = engine.connect() 

rslt = dbconn.execute("SELECT * FROM table WHERE col1=x AND col2=y;") 
df = pd.DataFrame(rslt.fetchall()) 
df.columns = rslt.keys() 

これはパフォーマンスの面でうまく機能私はPuTTYを開いて、そのプロセスの特別なステップとしてSSHトンネルを構築しています。これPuTTYの余分なステップを回避

(ⅱ)使用パッケージsshtunnel、:

from sshtunnel import SSHTunnelForwarder 

import mysql.connector 
from sqlalchemy import create_engine 

import pandas as pd 

server = SSHTunnelForwarder(
    (hostname, 22), 
    ssh_username=un_server, \ 
    ssh_password=pw_server, 
    remote_bind_address=('127.0.0.1', 3306)) 

server.start() 

engine = create_engine('mysql+mysqlconnector://un_db:[email protected]:' \ 
    + str(server.local_bind_port) + '/db') 
dbconn = engine.connect() 

rslt = dbconn.execute("SELECT * FROM table WHERE col1=x AND col2=y;") 
df = pd.DataFrame(rslt.fetchall()) 
df.columns = rslt.keys() 

SSHトンネルを構築するには、すべて正常に動作します(と思う)が、私はクエリを実行すると、スパイダーでIPythonコンソールがハングアップします。

質問:私のユースケースはPuTTYで動作しますが、パッケージsshtunnelでは動作しないのはなぜですか?そして、PuTTY経由のSSHトンネルとパッケージsshtunnel経由のSSHトンネルの違いはありますか?

答えて

0

を自動停止するためにwith文の構文を使用することができます(ii)が動作するようになりました:

from sshtunnel import SSHTunnelForwarder 
import MySQLdb as mdb 
import pandas as pd 

server = SSHTunnelForwarder(
    (hostname, 22), 
    ssh_username=un_server, \ 
    ssh_password=pw_server, 
    remote_bind_address=('127.0.0.1', 3306)) 

server.start() 

con = mdb.connect('127.0.0.1', un_db, pw_db, port=server.local_bind_port) 

df = pd.read_sql("SELECT * FROM table WHERE col1=x AND col2=y", con) 

con.close() 
server.stop() 
0

あなたには2つの同様の解決策があります。

(i)この場合、転送プロセスを作成します。 (Pythonプロセスではない)

(ii)この場合、server.start()新しいpython転送スレッドを開始します。このスレッドも同様の作業を行います。しかし、それはpythonスレッドであり、スレッドは停止するまで動作します。おそらく、これがあなたの問題の理由です。

問題に基づいて私は3つの解決策を提案できます。

  1. あなたはPuTTYのような転送処理を作成するためにsshtunnelを使用することができます。 READMEより:python -m sshtunnel -U username -P password -L :3306 -R 127.0.0.1:3306 -p 22 localhost

  2. sshtunnelフォワーディングスレッドを停止するのに、server.stop()を使用できます。

  3. あなたはまた、私はまた、新しい一つの解決策で、MySQLdbにmysql.connectorからドライバを切り替え (sshtunnel#example-2

関連する問題