実行時にクエリをデバッグする方法を探していますが、パラメータなどの挿入が完了した後、実行される実際のクエリをMySQLdbに出力させる方法があるかどうか疑問に思っていました。ドキュメントから、最後のクエリ実行に関する情報を提供するCursor.info()呼び出しがあるように見えますが、これは私のバージョン(1.2.2)には存在しません。
これは明らかな質問のように思えますが、すべての検索で答えを見つけることができませんでした。前もって感謝します。
実行時にクエリをデバッグする方法を探していますが、パラメータなどの挿入が完了した後、実行される実際のクエリをMySQLdbに出力させる方法があるかどうか疑問に思っていました。ドキュメントから、最後のクエリ実行に関する情報を提供するCursor.info()呼び出しがあるように見えますが、これは私のバージョン(1.2.2)には存在しません。
これは明らかな質問のように思えますが、すべての検索で答えを見つけることができませんでした。前もって感謝します。
と呼ばれるカーソルオブジェクト cursor._last_executed
に、例外が発生した場合でも実行する最後のクエリ文字列を保持する属性が見つかりました。これは、プロファイリングやMySQLクエリロギングを常に使用するよりも、本番環境での方が簡単で優れていました。どちらもパフォーマンスに影響を与え、より多くのコードや相互に関連する個別のログファイルなどが含まれるためです。
私自身の質問に答えるのは嫌いですが、これは私たちにとってよりうまく機能しています。
最後に実行されたクエリは、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))
私にとって/今のところ_last_executed
はもう動作しません。アクセスしたい現在のバージョンでは
cursor.statement
。
参照:https ://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html
mysql.connectorの場合:
cursor.statement
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html
これを行う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をふるいにかけて、サーバーが何を受信したかを確認する必要があります。
cursor.statement
とcursor._last_executed
発生したAttributeError
例外
cursor._executed
私のために働いた!
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
この読み取り専用プロパティは、最後に実行されたステートメントを文字列として返します。ステートメントプロパティは、MySQLサーバーに送信されたものをデバッグおよび表示するのに役立ちます。複数ステートメントの文字列が実行された場合、文字列には複数のステートメントを含めることができます。これは、multi = Trueのexecute()で発生します。この場合、ステートメントプロパティにはステートメント文字列全体が含まれ、execute()呼び出しは、個々のステートメントからの結果を処理するために使用できるイテレータを返します。このイテレータのステートメントプロパティは、個々のステートメントのステートメント文字列を示します。
str = cursor.statement
ソース:https ://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html
今まで見たとは言えない
Cursor.info()
ドキュメントで、数分検索しても見つかりません。たぶんあなたはいくつかの古いドキュメントを見ましたか?
それまでの間、 MySQLクエリログをいつでもオンにして、サーバーのログファイルを確認できます。
あなたの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))