2015-05-12 261 views
4

我想通過SSH將我的python程序連接到遠程MySQL數據庫。通過SSH連接到MySQL數據庫

我使用Paramiko進行SSH和SQLAlchemy。

這是我到目前爲止有:

import paramiko 
from sqlalchemy import create_engine 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('host', port=port, username='user', password='pass') 

engine = create_engine('mysql+mysqldb://user:[email protected]/db') 

我得到一個錯誤:

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2003, "Can't connect to MySQL server on 'mcsdev.croft-it.com' (60)") 
+0

如果服務器通過主機名是已經上市,爲什麼不從遠程自身授予對數據庫的訪問?似乎有點多餘通過SSH連接,然後到MySQL服務器 – fechnert

+0

因爲該程序將分發到許多不同的網站,我們不知道IP。我可以添加一個通配符,但我不認爲這會是理想的 – Mantis

+0

但是,如果在該應用程序運行的每個服務器上都有一個公共ip地址(對於ssh部分),則可以連接到數據庫本身。 – fechnert

回答

7

對不起我之前發佈了重複的答案。這是一個更詳細的答案,爲您的問題量身定做;)

如果您仍然需要通過SSH連接到遠程MySQL數據庫我已經使用了一個名爲sshtunnel的庫,它包裝並簡化了paramiko(依賴項sshtunnel)。

有了這個代碼,我想你會好到哪裏去:

from sshtunnel import SSHTunnelForwarder 
from sqlalchemy import create_engine 

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

engine = create_engine('mysql+mysqldb://user:[email protected]:%s/db' % server.local_bind_port) 

# DO YOUR THINGS 

server.stop() 
+0

我們是否需要手動處理連接和關閉連接,如果我將它與Flask一起使用? –