2011-08-15 6 views
48

나는 그들이 실행되는 쿼리를 디버깅하는 방법을 찾고 있는데, MySQLdb가 실제 매개 변수를 출력하도록하는 방법이 있는지 궁금 해서요. 설명서에서 Cursor.info() 호출이 있어야 마지막 쿼리 실행에 대한 정보를 얻을 수 있지만 내 버전 (1.2.2)에는 존재하지 않는 것처럼 보입니다.MySQLdb가 실행되는 실제 쿼리를 인쇄 하시겠습니까?

이 질문은 분명한 질문 인 것 같습니다.하지만 내 검색을 할 때마다 대답을 찾을 수 없었습니다. 미리 감사드립니다.

+0

이 라이브러리를 모르겠지만, 실제의 MySQL의 준비된 문을 사용하는 경우, 다음, 실제 쿼리를 볼 것이다 'EXECUTE stmt USING @ var1, var2, ....'와 같은 명령입니다. 그것이 당신에게 도움이 될지 확실하지 않습니다. – Mchl

+0

나는 [일반 쿼리 로그] (http://dev.mysql.com/doc/refman/5.1/en/query-log.html)를 켜고 쿼리가 실행되는지 확인합니다. –

+0

@MichaelMior 이것은 아마존의 RDS와 같은 호스팅 된 MySQL의 경우 항상 옵션이되는 것은 아닙니다. 파이썬 사이드 액세스를 갖는 것이 유용합니다. (단지 mysql 로그 설정을 변경하는 것이 항상 가능하지는 않다는 것을 지적하고 싶습니다.) –

답변

85

예외가 발생하더라도 마지막 쿼리 문자열을 보유하는 cursor._last_executed이라는 커서 개체의 특성을 발견했습니다. 이는 성능에 영향을 미치고 더 많은 코드 또는 더 많은 로그 파일을 서로 연관시켜 항상 프로파일 링을 사용하는 것보다 프로덕션 환경에서 더 쉽고 더 낫습니다.

내 질문에 대한 답변을 싫어합니다. 그러나 이것은 우리를 위해 더 잘 작동합니다.

+0

이 xitrium에서 나를 새롭게 해줘서 고마워. :) – fedmich

0

것은 내가 이제까지 문서에서

Cursor.info() 

을 본 적이 말할 수 없다, 나는 검색 몇 분을 찾을 수 없습니다. 오래된 문서를 본 것일까?

언제든지 MySQL Query Logging을 켜고 서버의 로그 파일을 볼 수 있습니다. 그것을 할 수

+0

"Cursor Objects"에서 http://mysql-python.sourceforge.net/MySQLdb.html을 보았습니다. : "info() 마지막 쿼리에 대한 정보를 반환합니다. 일반적으로이 정보를 확인할 필요가 없습니다." – xitrium

3

한 가지 방법은 profiling에 설정하는 것입니다 :

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 가려 낼 필요가 :

또 다른 방법은 로깅이 설정으로 서버를 시작하는 것입니다.

18
커서 속성 _last_executed와 마지막으로 실행 된 쿼리를 인쇄 할 수 있습니다

:; pymysql 대신 사용되어야한다

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

는 현재 pymysql의 실제 기능으로 이것을하는 방법에 대한 논의가 (pymysql issue #330: Add mogrify to Cursor, which returns the exact string to be executed 참조 MySQLdb)

편집 : 나는 지금 그것을 테스트하지 못했지만, this commit 다음과 같은 코드가 작동 할 수 있음을 나타냅니다 :

cursor.mogrify(sql, (arg1, arg2)) 
+0

pymysql이 이제 cur.mogrify (qstr, qargs)를 지원합니다. – e1i45

1

같은 말하기, 그러나 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  
관련 문제