3

データベースに渡されたリテラルSQLを返すためにpyodbcを使用する方法はありますか? 辞書のリストを反復する for ループ内のステートメントにパラメーターを渡しています。例えば:

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 モジュールを推奨できますか? 前もって感謝します。

4

2 に答える 2

3

組み込みではありませんが、実装はかなり簡単です。

他のソリューションと同様です。ただし、次のような一般的なメソッドを記述します。

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 ) )

成功したか失敗したかを呼び出し元に示す必要があるので、何かを返すか、例外を再発生させます。

于 2016-10-28T08:41:47.433 に答える
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呼び出しが成功した場合にのみログに記録するために、いくつかの例外処理を追加することをお勧めします。

于 2013-10-02T15:48:50.467 に答える