最近在做一個測試數據分析工具,因為涉及到mysql數據庫中的數據,所以寫了很多使用MySQLdb執行SQL的函數,慢慢就發現有一類很類似的函數:
def get_a_by_c(x):
return db.excute("SELECT a FROM t WHERE c=%s" % x)
def get_b_by_c(x):
return db.excute("SELECT b FROM t WHERE c=%s" % x)
它們在某個表內根據不同的條件查詢不同的字段,一樣的結構卻讓我們不得不重復的寫枯燥的函數。
解決
下面我們就用python函數(*)或(**)的參數方式來抽象這些查詢。因為*可以收集函數的普通參數,**可以收集函數的關鍵字參數,所以我們可以用如下的函數來達到上面兩個函數的目的。
def get(*fields, **conditions):
sql = "SELECT %s FROM t" % ','.join(fields)
if conditions:
sql += " WHERE " + " AND ".join(
map(lambda x: "%s=%%(%s)s" % (x, x), conditions))
return db.execute(sql)
# 調用如下
get(a, c=x)
get(b, c=x)
# 或者實現語句SELECT a,b FROM t WHERE c=x AND d=x
get(a, b, c=x, d=x)
當然甚至可以將表名抽象出來,不過這個就不是這裡要說的了,利用python動態語言的特性,可以用簡短的程序寫出強大的功能。