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')
感謝。
うーん...私は本当にその質問を理解していないような初心者です!コマンドプロンプトから接続したとき、私はオプションを使用しなかったので、私はPythonからも何も使用しませんでした。どのようなオプションを私は見ている必要がありますか?ありがとう。 –
あなたはここで正しい方向に進んでいると思います。私はグーグルのSSHオプションを試しましたが、直接関係があると思われるものは見つかりませんでした。あなたはもう少し説明できますか? (リモートデータベースは私のISPのサーバ上にあるので、どのように設定されたのかわかりませんが、私が探しているものが分かっていればわかります)@ IgnacioVazquez-Abrams –