博客 / 列表

songofhawk - 2023 新年好(順便記 Flask 的 Bad request 錯誤)

2023元旦,新年快樂呀! 無論過去幾年過得有多糟心,希望新的一年一切都正常起來,大家都能賺到錢。 前一段很忙,很久沒好好輸出了,想寫的內容,倒是攢了好多篇標題。大半夜的,偷懶記個小問題吧: 如果你用 Flask 實現過 restful 的接口,可能經常會遇到發送 POST 請求的時候,返回 400 BAD REQUEST 的情況,這時候即使可以調試,也看不到更多的錯誤信息了,因為還沒執行到自己的

rest , request , flask , Json , Python

songofhawk - Python + Sqlalchemy 對數據庫的批量插入或更新(Upsert)

本篇承接上一篇《Mysql 數據庫的批量插入或更新(Upsert)》的內容,來看看在 Python 中,怎麼實現大量數據的 upsert(記錄存在就更新,不存在則插入)。 由於不同數據庫對這種 upsert 的實現機制不同,Sqlalchemy 也就不再試圖做一致性的封裝了,而是提供了各自的方言 API,具體到 Mysql,就是給 insert statement ,增加了 on_duplicat

海量數據 , sqlalchemy , 數據庫 , 優化 , Python

songofhawk - mysql 大數據表的分頁性能優化

最近的工作中實現了一個定時統計功能:需要按指定順序,從源表中取出數據,經過分組合並,插入目標表。 源表數據量相當大,有幾千萬行,顯然不適合一次性取出(如果是一次性的腳本,在大內存的機器上也是可以考慮的,但定時任務每次啓動都佔用數十GB內存就太誇張了),需要分頁查詢。 但最初的實現中,採用了一個封裝好的分頁庫,單純的全表查詢,純粹依賴limit子句限制結果集窗口,構成的SQL語句類似這樣: sele

大數據 , sqlalchemy , MySQL , 查詢優化 , Python

songofhawk - Python import 時要注意的幾個問題

我們在Python中,總是使用import來導入另外一個模塊(文件)中的內容,如果是從Java或C轉過來的程序員,有幾個常見的坑要注意一下: import也是執行語句,可以在代碼任何部位執行。如果我們把import寫在代碼中間,IDE很可能會有個警告,但只要邏輯正確,就不用理它: import a if __name__ == "__main__": import b b.me

namespaces , demo , 測試 , import , Python

songofhawk - 越來越簡單的數據類定義:named tuple

説來慚愧,用python也挺久了,第一次發現namedtuple這麼個好東西。先上代碼: from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) pt1 = Point(1.0, 5.0) pt2 = Point(2.5, 1.5) from math import sqrt line_length =

數據類型 , 數據結構 , class , Python

songofhawk - 創業技術團隊如何做計劃

如何做計劃 如何做計劃,通常不是技術團隊自己的問題,而是整個公司的問題。常見情況是,一家業務驅動的公司,技術團隊是沒有什麼話語權的,大的需求計劃由銷售、運營或者管理層確定,技術團隊只負責執行,有時候中間還隔着一層產品經理。這種情況下想制定嚴密周到的計劃就是奢談,可能連合理都做不到。 我聽説過最誇張的公司,今天定需求,明天就要求上線,並且上線以後如果出現bug,按數量罰款,數額從數百到數千不等,如

創業 , 計劃任務 , 團隊管理 , 資源

songofhawk - Kivy 選擇文件對話框支持中文

這個問題其實跟Kivy中其他控件支持中文一樣,都是字體的問題,而不是字符集的問題,但我看網上能搜到的答案,全都圍着字符集打轉,有些還煞有介事地回答説:給 FileChooserListView 增加 file_encodings: ["utf-8"] 屬性就能解決 其實根本沒用——人家官方文檔已經寫了,缺省的字符集就是:[‘utf-8’, ‘latin1’, ‘cp1252’],已經包含utf-8

文件 , file , 中文 , Python , ui

songofhawk - Python動態執行代碼修改命名空間

在前面《Python 代碼動態執行初探》中講到過如何用exec和eval函數動態執行代碼,也描述瞭如何限制其命名空間,避免動態代碼造成環境“污染”。 不過,有的時候,我們的確想要讓動態代碼生成一些局部或全局的定義——比如一個變量名——讓原始代碼或者後面的動態代碼可以繼續使用。像下面這樣直接定義是無法生效的: def f(): a = 1 exec("a = 3") prin

namespaces , 變量 , dynamic-programming , Python