Monday, November 23, 2020

在Python中使用SQL語法的一些體驗(3)--讀入.sql

        前面兩篇介紹了SQL在python裡面的應用,這篇算是一個實戰經驗,如何依照你的編寫習慣,讓你的代碼自由縮排、換行

在Python中使用SQL語法的一些體驗(1)--建立數據結構的觀念

在Python中使用SQL語法的一些體驗(2)--連接數據庫

        Python語法最讓人頭疼的問題之一,就是換行與縮排是有意義的,你是不能隨意縮排、換行。python很容易出現一行的代碼很長,或是method裡面的參數太多,當你編寫和閱讀這些沒法換行或是對齊的代碼和都是很傷眼力的事情。

        對於一個非computer science的data scientist來說,看一下分布、分析目標的輪廓、數據格式、數據缺失等前期分析是基本,經常是看一下分析結果立刻修改代碼,再看一下結果再修改。一天跑個好幾十次修改是很平常的事。這時候我沒辦法只取出一點數據後在pycharm運行,確定無誤後在後台運行全量數據。有時候比較常發生的問題是數據量太大跑不動,我必續切出一個月、一周、一天的數據量跑看看,然後分批讀入與存儲結果。因此代碼的可閱讀性和彈性便相當重要。

        以上這些問題,加上前幾篇提到的pass through的優點,我在數據分析前期需要從原始數據庫讀回數據時,會在python面大量使用sql語法。

  • 存成.sql

      我個人偏好是將SQL的編程另外存成.sql的檔案,然後再讀入。這樣的好處是.sql裡面的代碼能依照你習慣的編程習慣能縮排、對齊。而且當你存成.sql時,關鍵詞自動上顏色而且tab對齊是有標識的的。


 
  • 格式化format vs  parms

        當你要讀入讀入這段sql,且去除換行時,只需要在開啟並讀入.sql的時候,同時將\n替換成空白,就能將.sql裡面你自己換行的sql語法轉換成一行,同時兼顧了sql的可閱讀性和可執行性。

        有注意到兩個很提別的地方嗎?.sql裡面有’{0}’,而read_sql裡面有 .format(‘phone’)。這是python裡面的格式化,.sql裡面的’{0}’會被替換成’phone’。這在寫循環,或是自建函數def時,能夠帶入你設定的參數。不過請注意,format存在 SQL Injection的風險。請注意使用場景,當在正式環境或是對外開放的接口時,請使用params


比較安全的方式是加入個params 。但比較麻煩的是params的語法會因為數據庫驅動程式不一樣而有不同的寫法。以上這個例子是使用sqlalchemy的 create_engine連接mysql,如果你是使用其它驅動,%(參數)s 的寫法就不一定能運行了。





No comments:

Post a Comment