programing

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

copysource 2022. 9. 25. 14:42
반응형

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: 실행할 정확한 문자열을 반환하는 커서에 mogrify 추가 참조).pymysql대신 사용해야 한다MySQLdb)

edit: 지금까지 테스트하지 않았습니다만, 커밋은, 다음의 코드가 기능하는 것을 나타내고 있습니다.

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

cursor.statement그리고.cursor._last_executed길러진AttributeError예외.

cursor._executed

날 위해 일했다!

한 가지 방법은 프로파일링을 켜는 것입니다.

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를 검색하여 서버가 수신한 내용을 확인해야 합니다.

나는 운이 좋았다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 쿼리 로그를 항상 켜고 서버의 로그 파일을 볼 수 있습니다.

과 같다고 합니다.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

반응형