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
'programing' 카테고리의 다른 글
Larabel에서 POST의 모든 정보를 얻는 방법 (0) | 2022.09.25 |
---|---|
MariaDB 설치: 설치 중에 서비스로 실행 중 선택을 취소했습니다.mariadb를 시작하고 멈추는 올바른 방법은 무엇입니까? (0) | 2022.09.25 |
SQL 열 추가 (0) | 2022.09.25 |
글로벌 플래그가 있는 RegExp에서 잘못된 결과가 나타나는 이유는 무엇입니까? (0) | 2022.09.25 |
CodeIgniter의 액티브레코드가 있는 데이터베이스에 NOW() 삽입 (0) | 2022.09.22 |