利用Python的裝飾器執行sql


利用Python的裝飾器執行sql


有一陣子非常喜歡Python的裝飾器,然後想了嘗試了很多用法,比如直接通過在函數上面加入裝飾器來執行sql, 為了方便起見,把數據打印出來。 初步設想如下:

<code>@mssql(sql="Select getdate()")
def get_data(sql_rst=""):
print sql_rst[0]/<code>

然後調用get_data()的時候,就可以看到自己需要的數據

很久之前,用過一陣子IronPython,是一個在微軟.net環境下運行的python版本, 它可以使用.net中的對象. 這裡就不說ironpython的運行環境了,可以自行在對應的官網上下載並安裝。

這裡就把這個裝飾器用IronPython實現了下,具體如下:

<code># -*- coding: utf-8 -*-
import clr
clr.AddReference('System.Data')
from System.Data import *
from functools import wraps

conn_str = "server=localhost;database=DB_TEST;uid=sa;password=sa2008"

def mssql(sql):
def handler_result(rs):
rst = []
while rs.Read():
rst.Add(rs[0])
return rst


def decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
TheConnection = SqlClient.SqlConnection(conn_str)
TheConnection.Open()
try:
MyAction = SqlClient.SqlCommand(sql, TheConnection)
MyReader = MyAction.ExecuteReader()
except Exception,ex:
raise AssertionError(ex)
rst_data = handler_result(MyReader)
kwargs["sql_rst"] = rst_data
result = fn(*args, **kwargs)
MyReader.Close()
TheConnection.Close()
return result
return wrapper
return decorator/<code>

使用的方式如本文一開始所述,在數據獲取函數上,加入裝飾器,並在裡面寫上對應的sql. 這樣調用這個函數的時候,就能得到結果。

想用純python實現也是一樣的, 只是需要安裝對應的數據庫驅動包而已,上面直接用裡的.net裡自帶的mssql驅動包。

大家也可以嘗試下這種玩法,歡迎交流~


分享到:


相關文章: