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
'IT박스' 카테고리의 다른 글
매니페스트의 권한이 Android 6에서 작동하지 않습니다. (0) | 2020.11.11 |
---|---|
PHP 배열에서 단일 값을 얻는 방법 (0) | 2020.11.10 |
SpinWait 대 수면 대기. (0) | 2020.11.10 |
인증서 서명 요청을받는 방법 (0) | 2020.11.10 |
Rails : POST 요청을 할 때 CSRF 토큰 신뢰성을 확인할 수 없습니다. (0) | 2020.11.10 |