2011-06-14 63 views
10

我正在使用SQLAlchemy並希望執行執行 SQL代碼(即所有綁定參數已被引用和替換的代碼)。在psycopg2的情況下,可以使用Cursor對象的query屬性(請參見psycopg documentation)。在MySQLdb的情況下,可以使用Cursor對象的_last_executed屬性。如何從SQLAlchemy中檢索已執行的SQL代碼

我的問題是:如何使用SQLAlchemy接口檢索剛執行的查詢字符串?它是否提供這樣的功能,還是我應該編寫自己的幫助函數?

在此先感謝您的幫助。

回答

21

SQLAlchemy uses the standard Python logging library。要登錄查詢到名爲db.log文件:

import logging 

logging.basicConfig(filename='db.log') 
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) 

當使用Python記錄,確保所有echo標誌被設置爲False,以避免重複記錄。現在,添加一些東西到DB:

>>> Movie(title=u"Blade Runner", year=1982) 
>>> session.commit() 

,紀錄是這樣的:

INFO:sqlalchemy.engine.base.Engine:BEGIN (implicit) 
INFO:sqlalchemy.engine.base.Engine:INSERT INTO models_movie (title, year, description) VALUES (%(title)s, %(year)s, %(description)s) RETURNING models_movie.id 
INFO:sqlalchemy.engine.base.Engine:{'title': u'Blade Runner', 'description': None, 'year': 1982} 
INFO:sqlalchemy.engine.base.Engine:COMMIT 
+1

沒錯,但(一),這也可能將消息發送到標準輸出,(b)您可以設置一個類似的效果只需將特定引擎的'echo'屬性設置爲True,並且(c)SQLA的日誌記錄不會以佔位符替換顯示查詢,儘管它會分別記錄參數化SQL和參數。 – 2011-06-15 11:43:21

+1

@Vinay這些都是好的一點,我已經更新了我的答案,以說明如何使用python日誌記錄專門記錄到一個文件,並顯示日誌輸出的示例 – zeekay 2011-06-15 14:04:22

+1

這很棒,而且您已經有了我的upvote :-) – 2011-06-15 14:13:43