79

実行時にクエリをデバッグする方法を探していますが、パラメータなどの挿入が完了した後、実行される実際のクエリをMySQLdbに出力させる方法があるかどうか疑問に思っていました。ドキュメントから、最後のクエリ実行に関する情報を提供するCursor.info()呼び出しがあるように見えますが、これは私のバージョン(1.2.2)には存在しません。

これは明らかな質問のように思えますが、すべての検索で答えを見つけることができませんでした。前もって感謝します。

4

10 に答える 10

124

と呼ばれるカーソルオブジェクト cursor._last_executedに、例外が発生した場合でも実行する最後のクエリ文字列を保持する属性が見つかりました。これは、プロファイリングやMySQLクエリロギングを常に使用するよりも、本番環境での方が簡単で優れていました。どちらもパフォーマンスに影響を与え、より多くのコードや相互に関連する個別のログファイルなどが含まれるためです。

私自身の質問に答えるのは嫌いですが、これは私たちにとってよりうまく機能しています。

于 2011-08-25T13:08:44.187 に答える
41

最後に実行されたクエリは、cursor属性を使用して印刷できます_last_executed

try:
    cursor.execute(sql, (arg1, arg2))
    connection.commit()
except:
    print(cursor._last_executed)
    raise

現在、これをpymysqlの実際の機能として取得する方法についての議論があります(pymysqlの問題#330:実行される正確な文字列を返すカーソルにmogrifyを追加します;pymysqlの代わりに使用する必要がありますMySQLdb

編集:私は今までにそれをテストしていませんが、このコミットは次のコードが機能する可能性があることを示しています:

cursor.mogrify(sql, (arg1, arg2))
于 2014-05-14T08:55:08.717 に答える
36

私にとって/今のところ_last_executedはもう動作しません。アクセスしたい現在のバージョンでは

cursor.statement

参照:https ://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html

于 2014-05-22T10:29:47.943 に答える
12

mysql.connectorの場合:

cursor.statement

https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html

于 2017-04-17T21:50:30.050 に答える
7

これを行う1つの方法は、プロファイリングをオンにすることです。

cursor.execute('set profiling = 1')
try:
    cursor.execute('SELECT * FROM blah where foo = %s',[11])
except Exception:
    cursor.execute('show profiles')
    for row in cursor:
        print(row)        
cursor.execute('set profiling = 0')

収量

(1L, 0.000154, 'SELECT * FROM blah where foo = 11')

引数がクエリに挿入され、クエリが失敗した場合でもクエリがログに記録されていることに注意してください。

もう1つの方法は、ロギングをオンにしてサーバーを起動することです。

sudo invoke-rc.d mysql stop
sudo mysqld --log=/tmp/myquery.log

次に、/ tmp / myquery.logをふるいにかけて、サーバーが何を受信したかを確認する必要があります。

于 2011-08-15T22:18:19.623 に答える
6

cursor.statementcursor._last_executed発生したAttributeError例外

cursor._executed

私のために働いた!

于 2021-01-05T13:33:08.230 に答える
2

cursor._last_executed一般的に言って運が良かったのですが、と一緒に使用すると正しく機能しませんcursor.executemany()。それは最後のステートメントを除いてすべてを落とします。基本的に、そのインスタンスで現在使用しているものは次のとおりです(実際のMySQLDbカーソルソースからの微調整に基づいています)。

def toSqlResolvedList( cursor, sql, dynamicValues ):
    sqlList=[]
    try:
        db = cursor._get_db()
        if isinstance( sql, unicode ): 
            sql = sql.encode( db.character_set_name() )
        for values in dynamicValues :
            sqlList.append( sql % db.literal( values ) )
    except: pass
    return sqlList    
于 2018-01-02T20:02:22.507 に答える
0

この読み取り専用プロパティは、最後に実行されたステートメントを文字列として返します。ステートメントプロパティは、MySQLサーバーに送信されたものをデバッグおよび表示するのに役立ちます。複数ステートメントの文字列が実行された場合、文字列には複数のステートメントを含めることができます。これは、multi = Trueのexecute()で発生します。この場合、ステートメントプロパティにはステートメント文字列全体が含まれ、execute()呼び出しは、個々のステートメントからの結果を処理するために使用できるイテレータを返します。このイテレータのステートメントプロパティは、個々のステートメントのステートメント文字列を示します。

str = cursor.statement

ソース:https ://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html

于 2021-09-18T19:26:44.667 に答える
-1

今まで見たとは言えない

Cursor.info()

ドキュメントで、数分検索しても見つかりません。たぶんあなたはいくつかの古いドキュメントを見ましたか?

それまでの間、 MySQLクエリログをいつでもオンにして、サーバーのログファイルを確認できます。

于 2011-08-15T22:12:08.950 に答える
-2

あなたのSQLは次のようなものだと思いますselect * from table1 where 'name' = %s

from _mysql import escape
from MySQLdb.converters import conversions

actual_query = sql % tuple((escape(item, conversions) for item in parameters))
于 2016-11-09T01:35:30.763 に答える