2016-04-25 31 views
0

Python 3.4を使用して同時に2つのMySQLデータベース(ローカル、リモート)に接続しようとしていますが、本当に苦労しています。問題を3つに分割する:Python 3.4からのリモートMySQLデータベースへの接続

  • 手順1:ローカルDBに接続します。これは、PyMySQLを使用してうまくいきます。 (MySQLdbはPython 3.4と互換性がありません。 コース)
  • ステップ2:リモートDBに接続します( SSHを使用する必要があります)。私はそれをLinuxのコマンドプロンプトから動作させることはできますが、Pythonの はできません。以下を参照してください。
  • 手順3:同じ時刻に に両方に接続します。私は リモートデータベースのために別のポートを使用すると思いますので、同時に両方の接続を持つことができます しかし、私はここから深いところです!それが適切であれば、2つのDBは の名前が異なります。この質問に直接関連していない場合は、 私に教えてくださいと私はそれを別に投稿します。

残念ながら私は初心者のための正しい場所から始めていません...一度この作業をすることができたら、基本的なPythonとSQLに戻ってうれしく思いますが、誰かが私を同情させてくれます手を始めよう!

手順2のコードは以下のとおりです。これはの例に非常に近いようですが、この質問はPython - SSH Tunnel Setup and MySQL DB Accessに答えていますが、これはMySQLdbを使用しています。今のところ私は接続パラメータを埋め込んでいます。正しく動作すれば、設定ファイルに移動します。

import dropbox, pymysql, shlex, shutil, subprocess 
from sshtunnel import SSHTunnelForwarder 
import iot_config as cfg 

def CloseLocalDB(): 
    localcur.close() 
    localdb.close() 

def CloseRemoteDB(): 
    # Disconnect from the database 
# remotecur.close() 
# remotedb.close() 
    # Close the SSH tunnel 
# ssh.close() 
    print("end of CloseRemoteDB function") 

def OpenLocalDB(): 
    global localcur, localdb 
    localdb = pymysql.connect(host=cfg.localdbconn['host'], user=cfg.localdbconn['user'], passwd=cfg.localdbconn['passwd'], db=cfg.localdbconn['db']) 
    localcur = localdb.cursor() 

def OpenRemoteDB(): 
    global remotecur, remotedb 
    with SSHTunnelForwarder(
      ('my_remote_site', 22), 
      ssh_username = "my_ssh_username", 
      ssh_private_key = "/etc/ssh/my_private_key.ppk", 
      ssh_private_key_password = "my_private_key_password", 
      remote_bind_address = ('127.0.0.1', 3308)) as server: 
     remotedb = None 
#Following line gives an error if uncommented 
#  remotedb = pymysql.connect(host='127.0.0.1', user='remote_db_user', passwd='remote_db_password', db='remote_db_name', port=server.local_bind_port) 
     #remotecur = remotedb.cursor() 

# Main program starts here 
OpenLocalDB() 
CloseLocalDB() 
OpenRemoteDB() 
CloseRemoteDB() 

これは私が取得していますエラーです:事前に

2016-04-21 19:13:33,487 | ERROR | Secsh channel 0 open FAILED: Connection refused: Connect failed 
2016-04-21 19:13:33,553 | ERROR | In #1 <-- ('127.0.0.1', 60591) to ('127.0.0.1', 3308) failed: ChannelException(2, 'Connect failed') 
---------------------------------------- 
Exception happened during processing of request from ('127.0.0.1', 60591) 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.4/dist-packages/sshtunnel.py", line 286, in handle 
    src_address) 
    File "/usr/local/lib/python3.4/dist-packages/paramiko/transport.py", line 834, in open_channel 
    raise e 
paramiko.ssh_exception.ChannelException: (2, 'Connect failed') 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/usr/lib/python3.4/socketserver.py", line 613, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python3.4/socketserver.py", line 344, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/usr/lib/python3.4/socketserver.py", line 669, in __init__ 
    self.handle() 
    File "/usr/local/lib/python3.4/dist-packages/sshtunnel.py", line 296, in handle 
    raise HandlerSSHTunnelForwarderError(msg) 
sshtunnel.HandlerSSHTunnelForwarderError: In #1 <-- ('127.0.0.1', 60591) to ('127.0.0.1', 3308) failed: ChannelException(2, 'Connect failed') 
---------------------------------------- 
Traceback (most recent call last): 
    File "/home/pi/Documents/iot_pm2/iot_ssh_example_for_help.py", line 38, in <module> 
    OpenRemoteDB() 
    File "/home/pi/Documents/iot_pm2/iot_ssh_example_for_help.py", line 32, in OpenRemoteDB 
    remotedb = pymysql.connect(host='127.0.0.1', user='remote_db_user', passwd='remote_db_password', db='remote_db_name', port=server.local_bind_port) 
    File "/usr/local/lib/python3.4/dist-packages/pymysql/__init__.py", line 88, in Connect 
    return Connection(*args, **kwargs) 
    File "/usr/local/lib/python3.4/dist-packages/pymysql/connections.py", line 678, in __init__ 
    self.connect() 
    File "/usr/local/lib/python3.4/dist-packages/pymysql/connections.py", line 889, in connect 
    self._get_server_information() 
    File "/usr/local/lib/python3.4/dist-packages/pymysql/connections.py", line 1190, in _get_server_information 
    packet = self._read_packet() 
    File "/usr/local/lib/python3.4/dist-packages/pymysql/connections.py", line 945, in _read_packet 
    packet_header = self._read_bytes(4) 
    File "/usr/local/lib/python3.4/dist-packages/pymysql/connections.py", line 981, in _read_bytes 
    2013, "Lost connection to MySQL server during query") 
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') 

感謝。

+0

うーん...私は本当にその質問を理解していないような初心者です!コマンドプロンプトから接続したとき、私はオプションを使用しなかったので、私はPythonからも何も使用しませんでした。どのようなオプションを私は見ている必要がありますか?ありがとう。 –

+0

あなたはここで正しい方向に進んでいると思います。私はグーグルのSSHオプションを試しましたが、直接関係があると思われるものは見つかりませんでした。あなたはもう少し説明できますか? (リモートデータベースは私のISPのサーバ上にあるので、どのように設定されたのかわかりませんが、私が探しているものが分かっていればわかります)@ IgnacioVazquez-Abrams –

答えて

1

J.M.Fernándezさんの多くの助けを借りてGithubにあるので私は解決策があります。最初にコピーした例はポート3308を使用していますが、ポート3306は標準です。私がこれを変更したら、それは働き始めた。

関連する問題