python中的with語句

    今天同事找到我說,他用pyton連接不上數據庫。出於安全考慮,我們的數據庫不允許直連,需要通過跳板機進行連接。所以,我認爲是他沒有使用ssh隧道。結果看了代碼後,發現使用了sshtunnel模塊的。

    將他的代碼拿來後,自己運行了一遍。也是報錯(2013, 'Lost connection to MySQL server during query')。以爲是網絡原因,又接着運行了幾遍,還是報相同的錯誤。覈對了下,連接信息都沒問題的,檢查網絡,也沒發現異常。頓時傻眼了,不知所措。就先去解決其他問題了。晚上回到家後,有着強迫症的我,又重新打開了代碼,端詳了起來。

    

with SSHTunnelForwarder(
         (ip, port),    #B機器的配置
         ssh_username="user",
         ssh_password="password",
         remote_bind_address=('ip', port)
         #logger=create_logger(loglevel=1)
) as server:
    conn = MySQLdb.connect(host='127.0.0.1',
			   port=server.local_bind_port,
			   username='username'
			   password='password'
			   db='db'
			   charset='utf8'	)
cursor = conn.cursor()
sql = 'select * from test limit 1'

如上代碼,一開始並沒發覺哪裏不對,但後來看到那個報錯,又想到前幾天看到python中with的用法,似乎有了眉目。將sql代碼放在with塊裏邊執行。一切都OK了,瞬間覺得恍然大悟。這和with語句的特性密不可分。with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用後自動關閉、線程中鎖的自動獲取和釋放等。


詳細見https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章