2017-09-18 2 views
1

Früher habe ich immer benutzt, um etwas wie ...Python MySQL - Rückkehr Cursor und Verbindung von Funktion

def getConn(): 
    cnx = mysql.connector.connect(user='user', password='pass', 
             host='hostIP', 
             database='database') 
    cur = cnx.cursor(buffered=True) 
    return [cnx, cur] 

CNX und Köter Objekte für den Einsatz zurück. Das funktioniert gut.

Ich brauche jetzt eine SSH-Verbindung zu einem DB.

Das folgende Beispiel führt die Abfrage in der Funktion, sondern die CNX oder Köter Objekte zur Verwendung danach nicht zurück, so erhalte ich einen Druck des Ergebnisses durch den Fehler gefolgt

mysql.connector.errors.InterfaceError: 2013: Lost connection to MySQL server during query

I erscheinen das gleiche Problem zu haben (obwohl ein anderer Fehler zurückgegeben wurde) Why won't Python return my mysql-connector cursor from a function?

Diese Frage befasst sich mit warum - Ich würde gerne wissen, ob es eine Lösung gibt.

def returnConnect(): 
    mypkey = paramiko.RSAKey.from_private_key_file('/Users/me/.ssh/id_rsa') 
    sql_hostname = '127.0.0.1' 

    with SSHTunnelForwarder(
     (ssh_host, ssh_port), 
     ssh_username=ssh_user, 
     ssh_pkey=mypkey, 
     remote_bind_address=(sql_hostname, sql_port)) as tunnel: 

     cnx = mysql.connector.connect(host='127.0.0.1', user=sql_username, 
       passwd=sql_password, db=sql_main_database, 
       port=tunnel.local_bind_port) 
     cur = cnx.cursor(buffered=True) 

     sql = "select * from table" 
     cur.execute(sql) 
     result = cur.fetchall() 
     print result 
     return [cnx, cur] 

conn = returnConnect() 
cnx = conn[0] 
cur = conn[1] 
sql = "select * from table" 
cur.execute(sql) 
result = cur.fetchall() 
cnx.close() 
print result 

Antwort

2

Python ruft spezielle Methode __exit__ nach with..as Ausführung, so dass Ihre Verbindung geschlossen wird, nachdem aus dem Kontext der with zurück. Vergeben den Tunnel forvarder auf eine Variable, wie `ll Folge und die Verbindung außerhalb des Funktionsumfangs

tunnel = SSHTunnelForwarder(
     (ssh_host, ssh_port), 
     ssh_username=ssh_user, 
     ssh_pkey=mypkey, 
     remote_bind_address=(sql_hostname, sql_port)) 

Lesen mehr über Verbindung within the docs Anweisung verwenden können.

+0

Ja - das funktioniert super. Liest "mit" und auch gute Praxis beim Öffnen und Schließen des SSH-Tunnels. –

Verwandte Themen