2013-10-01 46 views
2

有什麼辦法使用pyodbc來返回傳遞給數據庫的文字sql?我將參數傳遞給for循環中的語句,遍歷字典列表。例如:任何使用pyodbc返回文字的方式SQL

mylist = [{'name': 'john', 'key': 1}, {'name': 'jane', 'key': 2}] 
sql = "update people set name = ? where key = ?" 
for i in mylist: 
    cursor.execute(sql, i['name'], i['key']) 

我希望能夠打印或存儲腳本傳遞到數據庫的文字sql。如果這不可能使用pyodbc,有人可以推薦一個具有此功能的不同Python模塊嗎?提前致謝。

+1

AFAIK沒有「文字SQL」。這就是準備好的語句 - 節省了大量(昂貴的)字符串處理和兩端的(de)轉義。 –

+0

也許我使用了錯誤的術語。對於上面的代碼,我想要的第一個迭代是字符串「update people set name ='john'where key ='1'」。這樣我就可以保存腳本執行的所有sql語句的日誌。 –

+0

@JamesNicholson但是這不是什麼被髮送到數據庫。 – Goyo

回答

1

它不是內置的,但實現相當簡單。

與其他解決方案類似。但寫這樣一個通用的方法:

def executeAndLog(db_cursor, sql, *args) : 
    run_sql = sql.replace('?', '{!r}').format(*args) 
    try: 
     db_cursor.execute(sql, *args) 
     logging.info(run_sql) 
    except Exception as e: 
     logging.error(" ".join(run_sql, "failed with error", e)) 

你可能會想一些指示呼叫者是否它成功與否,所以無論是返回的東西或重新拋出異常。

0

你可以使用內置的日誌模塊:

import logging 
import pyodbc 

# setup logging level and file name 
logging.basicConfig(filename='sql.log', level=logging.DEBUG) 

# connection = pyodbc.... 
# cursor = connection... 

# define parameter values and sql 
mylist = [{'name': 'john', 'key': 1}, {'name': 'jane', 'key': 2}] 
sql = "update people set name = ? where key = ?" 

for i in mylist: 
    cursor.execute(sql, i['name'], i['key']) 
    # {!r} ensures string values wrapped with single quote 
    logging.debug(sql.replace('?', '{!r}').format(i['name'], i['key'])) 

你可能想添加一些異常處理周圍cursor.execute如果調用成功只記錄。

+0

更好的「解決方案」將使用* args – CashCow