MySQL 將查詢結果匯出到檔案

weixin_34050427發表於2017-12-24

平常我們一直用的是 Navicat for MySQL 這樣一個圖形化工具來將查詢結果匯出至 Excel 檔案。但是最近由於業務的需要,必須採用 SQL 語句來將查詢結果匯出至檔案。在網上查詢了相關資料並結合自己實踐之後,總結如下。

首先檢視 secure_file_priv 配置項,找到檔案輸出路徑
方法1:通過 MySQL 下的配置檔案 my.ini 進行設定,Ctrl+F 查詢 secure-file-priv ,然後將路徑改為你要匯出檔案的儲存路徑。
方法2:通過命令 SHOW VARIABLES LIKE '%secure%'; 檢視路徑。

特別注意:secure-file-priv 這個變數不支援動態修改,因此修改後必須重啟 MySQL 服務。

接著一定要將匯出的檔案設定為 MySQL 可以寫的許可權
Windows 下,在資料夾中右鍵->屬性->安全->選擇一個使用者,然後編輯它的許可權。注意:寫入許可權是一定要有的。

9676068-40eb8110cfa7320d.png

如果匯出的路徑不對,或者沒有對應的許可權。那麼在執行程式的時候都會報如下錯誤。

ERROR 1290(HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

然後,我們就可以開始匯出結果了。語法就參考下面的 example 吧,LZ 有點懶 ^v^

SELECT "使用者名稱", "密碼", "身份" UNION ALL
SELECT u.UserName, u.PassWord, u.Status FROM news_tagging_app_user as u INTO OUTFILE 'D:/PythonProject/news_tagging_system/news_tagging_app/static/tag_user_result.csv'
CHARACTER SET gbk   #將查詢結果轉換為GB2312格式
FIELDS TERMINATED BY ','    #指定列之間分隔符
LINES TERMINATED BY '\r\n'  #'\r'換行符, '\n'新行符
;

----------------------------------------------------------------------------------------------------------------------------
補充說明:
① 在描述路徑的時候注意是左斜槓,要與 Windows 系統中的右斜槓進行區分。
② 用 UNION ALL 來達到新增表頭的目的。具體的 UNION 和 UNION ALL 的用法參考該頁面。
③ 其他見註釋。
----------------------------------------------------------------------------------------------------------------------------

新的問題來了,如果匯出的檔案已存在如何實現對原有檔案的覆蓋
預設情況下是會報錯,提示檔案已存在。

[Err] 1086 - File 'D:/PythonProject/news_tagging_system/news_tagging_app/static/tag_user_result.csv' already exists

解決思路:
方法1:在匯出之前通過 bat 批處理指令碼先判斷檔案是否存在,若存在則刪除,然後再匯出結果。這個方法的弊端在於要同時執行兩個定時器,一個是 Windows 平臺上的計劃任務用於定時執行 bat批處理檔案,另一個則是資料庫中有一個定時器,用於定時匯出結果。二者只要一個出了問題都會導致系統出現 Bug,無疑會降低系統的魯棒性,並且如何讓二者在一先一後的情況下如何做到無縫對接也是一個大問題,因此該方法不推薦使用。

方法2:對檔案進行動態命名,保證每次命名都不一致,並且能保證有規律可循,能簡單高效找到最新匯出的版本。*請參看下一篇文章MySQL 將查詢結果匯出到檔案(續)》。



該文章於2017年9月29日於CSDN上首次發表,2017年12月24日搬家至此!

相關文章