2016-10-30 7 views
0

データベースにアクセスするためのsshtunnelを作成しようとしています。私はSQLalchemyとpandasと一緒にsshtunnelパッケージを使用しています。関数内でsshtunnelが機能しない場合

例1

# run in terminal 
ssh -L 5433:127.0.0.1:5432 [ssh_config]  

# run in iPython 
pd.read_sql_query(query, conn) 

私は自分の端末上でSSHトンネルを作成し、(上記の例を参照)パンダにクエリを実行すると、それが正常に動作し、データフレームが返されます。

例2

Iがトンネルを作成し、そのコンテキスト内の接続を生成するとき、それは動作しません。

with SSHTunnelForwarder(
    os.environ['SSH_ADDRESS'], 
    ssh_username=os.environ['SSH_USER'], 
    ssh_pkey=os.environ['SSH_PKEY'], 
    remote_bind_address=('127.0.0.1', 5432), 
    local_bind_address=('0.0.0.0', 5433) 
) as sshserver: 
    conn = self.engine.connect() 
    pd.read_sql_query(query, conn) 
    conn.close() 
    sshserver.stop() 

エラーメッセージは次のとおりです。

OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected 
[SQL: '\nselect \nid\n\nfrom \nclean.accounts \n\nlimit 10\n'] 

本当に好奇心旺盛なことは、この問題 '交互に' ということです。これは、一度実行するとエラーメッセージが表示されるということです。しかし、私が関数を再度実行すると、Dataframeが返されます。 3回目の実行を試みると、エラーメッセージが再度表示されます。これはコマンドを実行するたびに無期限に続きます。

問題は何ですか?

答えて

0

最後の行からsshserver.stop()を削除するとうまくいくと思います。 with関数を使用してファイルまたはサーバー接続を処理するとき。それ自体は、ファイルまたは接続respを閉じる&を世話します。明示的に接続を閉じる必要はありません。

詳細説明here

関連する問題