您好,登錄后才能下訂單哦!
Python基礎學習教程:python腳本報錯如何忽略MySQLdb的warnings
一、前言
這是在執行python腳本的時候遇到的bug,瘋狂的報warnings警告,一坨一坨的,看著實在不雅觀,so,還是解決一下比較好。本篇主要講述的是錯誤的發現以及如何忽略warnings警告。
報錯如下:
test.py:531: Warning: Duplicate entry '11-5' for key 'idx_user_city' cursor_build.execute(insert_build_sql) test.py:531: Warning: Duplicate entry '367-2' for key 'idx_user_city'
根據報錯,我們知道錯誤是因為插入數據的時候主鍵重復造成的。不過已經用了insert ignore into來插入了,怎么還是會報錯呢?
二、為何會拋出warnings
1、拋出錯誤的原因
后來搜索發現,insert ignore 的插入方式,雖然能避免異常error,但是確實會拋出異常。只是平時沒有像這次把warings展示出來了,為什么會展示呢?
2、mysql的因素
查看mysql的錯誤級別:
mysql> show variables like '%log_warnings%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_warnings | 1 | +---------------+-------+ 1 row in set, 1 warning (0.00 sec)
根據log_warnings定義:
(1) log_warnings用于標識警告信息是否一并記錄到錯誤日志中。
(2) log_warnings的值為0,表示不記錄警告信息。
(3) log_warnings的值為1,表示警告信息一并記錄到錯誤日志中。
(4) log_warnings的值大于1,表示"失敗的連接"的信息和創建新連接時"拒絕訪問"類的錯誤信息也會被記錄到錯誤日志中。
由此可見此時的數據庫,設置的錯誤級別是記錄warnings的,只是你記錄沒錯,但是拋出來就是你的不對了呀。
三、修改python腳本,實現屏蔽warnings錯誤的目的
默認的try..except是捕獲python腳本中的error的,默認是捕獲不到warnings,那么是否可以把warnings轉化成error,然后用try..except來捕獲呢
1、把warnings轉化成error捕獲
#import部分 from warnings import filterwarnings filterwarnings('error', category=MySQLdb.Warning)
打印異常:
try: xxxx except MySQLdb.Warning, w: sqlWarning = "Warning:%s" % str(w)
把異常轉化為error捕獲會報錯:
Traceback (most recent call last): File "test.py", line 548, in <module> main() File "test.py", line 533, in main cursor_build.execute(insert_build_sql) File "cursors.py", line 175, in execute if not self._defer_warnings: self._warning_check() File "/cursors.py", line 89, in _warning_check warn(w[-1], self.Warning, 3) _mysql_exceptions.Warning: Duplicate entry '11-5' for key 'idx_user_city'
本地測試是沒通過,但是覺得這種方式應該是可行的,礙于時間,選擇了下面的屏蔽warings方式,不過這種轉換warnings為error的思路還是很好地,有興趣的同學可以嘗試下。
2、把warnings 直接忽略:
from warnings import filterwarnings filterwarnings('ignore', category=MySQLdb.Warning)
下面的try..except中只需要正常捕獲異常就行。執行py腳本:
[xxx]$ python2.7 test.py 01:44:45 py Finished
執行成功,查看數據庫,也都成功寫入,世界都安靜了。
更多的 Python基礎學習教程接下來會繼續為大家更新!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。