2010-09-07 49 views
3

我正在Python中創建一個基本的數據庫實用程序類。我正在將一箇舊模塊重構爲一個類。我現在正在研究一個executeQuery()函數,我不確定是保留舊的設計還是改變它。這裏有2種選擇:Python中的設計問題:這應該是一個通用函數還是兩個特定函數?

  1. (舊的設計:)有一個通用的executeQuery方法,它採用的查詢執行和一個布爾commit參數,指示是否提交(插入,更新,刪除)否(選擇),並用if語句確定是否提交或選擇並返回。
  2. (這是我習慣的方式,但可能是因爲你不能有一個功能,有時會返回一些東西,有時並沒有在語言,我曾與:)有2個功能,executeQueryexecuteUpdateQuery(或類似的東西)。 executeQuery將執行一個簡單的查詢並返回結果集,而executeUpdateQuery將更改數據庫(插入,更新,刪除)並返回任何內容。

是否接受使用第一種方式?對我來說似乎還不清楚,但也許它更蟒蛇......? Python是非常靈活的,也許我應該利用這種功能,這種功能不能用這種更嚴格的語言來完成......

而這個問題的第二部分,與主要思想無關 - 什麼是在Python中返回查詢結果的最佳方式是什麼?使用哪個函數來查詢數據庫,以什麼格式...?

+0

與您的主要問題無關,但如果您正在編寫SQL後端的接口,則可以嘗試儘可能嚴格地遵循DBAPI:http://www.python.org/dev/peps/ pep-0249/- 兼容DBAPI的模塊可以更容易地集成到其他知道如何與數據庫交談的Python軟件中。 – 2010-09-07 20:06:51

+0

'executeUpdate'可以返回受影響的行數。爲了返回靈活的結果,你可以將row_factory_function傳遞給你的'executeQuery'。 – MattH 2010-09-07 20:12:37

回答

2

我不知道如何回答你的問題的第一部分,它似乎比風格更重要。也許你可以調用Single Responsibility Principle來爭辯它應該是兩個獨立的功能。

當你將返回不確定長度的序列,這是最好使用Generator

2

我會有兩個方法,一個更新數據庫和一個沒有。如果它們共享大量的代碼,它們都可以委託給一個通用的私有方法。

兩種方法分離,顯然給調用者都有哪些不同的語義是在兩者之間,使記錄了不同的方法更簡單,並闡明什麼返回類型的期望。由於您可以將共享代碼拖放到對象上的私有方法中,因此不必擔心重複代碼。

至於返回查詢結果,這將取決於您要加載所有來自數據庫的結果返回之前,或返回遊標對象。我會試着做一些這樣的:

with db.executeQuery('SELECT * FROM my_table') as results: 
    for row in results: 
     print row['col1'], row['col2'] 

...所以executeQuery方法返回一個ContextManager對象(如果需要的話它會清除所有打開的連接),這也可作爲Generator。發生器的結果爲只讀dict s。

4

這propably只是我和我的FP迷信,但我認爲只用於副作用執行的功能是從一個非破壞性的功能,其獲取的一些數據非常不同,因此有不同的名稱。特別是如果通用函數會根據不同的情況做不同的事情(commit參數的部分似乎暗示了這一點)。

至於如何返回結果...我是一個巨大的發電機愛好者,但是如果你用於數據庫連接的庫無論如何都會返回一個列表,那麼你不妨通過這個列表 - 在這種情況下發電機不會爲你購買任何東西。但是,如果它允許您迭代結果(一次一個),則抓住機會在較大的查詢上節省大量內存。

相關問題