IT박스

MySQLdb가 실행하는 실제 쿼리를 인쇄 하시겠습니까?

itboxs 2020. 11. 10. 07:58
반응형

MySQLdb가 실행하는 실제 쿼리를 인쇄 하시겠습니까?


쿼리가 실행될 때 디버깅하는 방법을 찾고 있는데 MySQLdb가 매개 변수 삽입을 마친 후 실행되는 실제 쿼리를 인쇄하도록하는 방법이 있는지 궁금합니다. 문서에서 보면 마지막 쿼리 실행에 대한 정보를 제공하는 Cursor.info () 호출이있는 것처럼 보이지만 내 버전 (1.2.2)에는 존재하지 않습니다.

이것은 명백한 질문처럼 보이지만 모든 검색에 대해 답을 찾을 수 없었습니다. 미리 감사드립니다.


cursor._last_executed예외가 발생하더라도 실행할 마지막 쿼리 문자열을 보유하는 라는 커서 개체의 속성을 찾았습니다  . 이는 항상 프로파일 링을 사용하거나 MySQL 쿼리 로깅을 사용하는 것보다 프로덕션에서 더 쉽고 낫습니다. 둘 다 성능에 영향을 미치고 더 많은 코드 또는 더 많은 상관 관계가있는 별도의 로그 파일 등을 포함하기 때문입니다.

내 질문에 답하고 싶지 않지만 이것은 우리에게 더 잘 작동합니다.


커서 속성을 사용하여 마지막으로 실행 된 쿼리를 인쇄 할 수 있습니다 _last_executed.

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

현재, 이것을 pymysql의 실제 기능으로 얻는 방법에 대한 논의가 있습니다 ( pymysql 문제 # 330 : 실행할 정확한 문자열을 반환하는 Cursor에 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


이를 수행하는 한 가지 방법은 프로파일 링 을 켜는 것입니다 .

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

인수가 쿼리에 삽입되었으며 쿼리가 실패한 경우에도 쿼리가 기록되었음을 확인합니다.

또 다른 방법은 로깅을 켠 상태에서 서버를 시작하는 것입니다.

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

그런 다음 /tmp/myquery.log를 검색하여 서버가받은 내용을 찾아야합니다.


mysql.connector의 경우 :

cursor.statement

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


나는 cursor._last_executed일반적으로 운이 좋았지 만 .NET과 함께 사용하면 제대로 작동하지 않습니다 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    

본 적이 없다고 말할 수 없어

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

참고 URL : https://stackoverflow.com/questions/7071166/print-the-actual-query-mysqldb-runs

반응형