source

Python은 MySQL 준비문을 지원합니까?

lovecheck 2023. 1. 15. 17:00
반응형

Python은 MySQL 준비문을 지원합니까?

이전에 PHP 프로젝트에서 작업한 적이 있는데, 준비된 문장으로 SELECT 쿼리가 20% 빨라졌습니다.

Python에서 동작하는지 궁금하네요.나는 특별히 그것이 하고 있지 않다고 말하는 것을 찾을 수 없을 것 같다.

대부분의 언어는 범용 파라미터화된 스테이트먼트를 실행하는 방법을 제공하지만 Python도 다르지 않습니다.매개 변수화된 조회가 사용되는 경우 문 준비를 지원하는 데이터베이스는 자동으로 조회를 수행합니다.

python에서 파라미터화된 쿼리는 다음과 같습니다.

cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])

파라미터화의 구체적인 스타일은 드라이버에 따라 다를 수 있습니다.db 모듈을 Import하고 나서print yourmodule.paramstyle.

PEP-249부터:

paramstyle의

       String constant stating the type of parameter marker
       formatting expected by the interface. Possible values are
       [2]:

           'qmark'         Question mark style, 
                           e.g. '...WHERE name=?'
           'numeric'       Numeric, positional style, 
                           e.g. '...WHERE name=:1'
           'named'         Named style, 
                           e.g. '...WHERE name=:name'
           'format'        ANSI C printf format codes, 
                           e.g. '...WHERE name=%s'
           'pyformat'      Python extended format codes, 
                           e.g. '...WHERE name=%(name)s'

단도직입적으로 대답해요, 그렇지 않아요.

조쉬페리의 대답은 대신 그것이 하는 일에 대한 좋은 설명입니다.

유진 Y의 답변부터 비슷한 질문까지

MySQLdb 패키지의 코멘트를 확인합니다.

"파라미터화"는 MYSQL_STMT API를 사용하는 대신 문자열을 이스케이프하여 쿼리에 맹목적으로 보간함으로써 MySQLdb에서 수행됩니다.따라서 Unicode 문자열은 데이터베이스에 수신되기 전에 두 개의 중간 표현(인코딩 문자열, 이스케이프 인코딩 문자열)을 거쳐야 합니다.

답은 '아니, 그렇지 않아'입니다.

MySQLdb 패키지의 커서 오브젝트 execute() 메서드(mysql과 통합하기 위한 사실상의 패키지의 일종)를 간단히 살펴본 결과, (적어도 기본적으로는) 문자열 보간 및 견적만 수행되고 실제 파라미터화된 쿼리는 수행되지 않는 것으로 보입니다.

if args is not None:
    query = query % db.literal(args)

만약 이게 문자열 보간이 아니라면요?

executeemany의 경우 insert/replace를 루프에서 실행하는 것이 아니라 실제로 단일 문장으로 실행하려고 합니다.그게 다야, 마법은 없는 것 같아.적어도 그것의 기본 동작은 아니다.

편집: 아, 모듈로 연산자가 오버라이드 될 수 있다는 것을 방금 깨달았습니다만, 부정행위를 하고 싶다고 생각하고, 출처를 알렸습니다.오버리든을 찾지 못했습니다.mod어디든지.

이를 이해하려는 사람들은 Python과 MySQL에서 준비된 문장을 사용할 수 있습니다.MySQL 자체에서 MySQL 커넥터/Python을 사용하고 오른쪽 커서를 인스턴스화하기만 하면 됩니다.

https://dev.mysql.com/doc/connector-python/en/index.html

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

성능만 고려한다면 Amit의 제안대로 SQL Interface를 사용하는 것이 좋습니다.그러나 준비된 스테이트먼트에 대한 네이티브 Python 지원이 가져올 수 있는 SQL 주입에 대한 보호 기능이 상실됩니다.Python 3에는 Postgre를 위한 준비된 스테이트먼트를 지원하는 모듈이 있습니다.SQL. MySQL의 경우 "oursql"은 진정한 준비된 스테이트먼트를 지원하는 것 같습니다(다른 모듈처럼 가짜가 아닙니다).

직접 관련이 없지만 SO의 다른 질문에 대한 이 답변에는 '템플릿' 쿼리의 구문 세부 정보가 포함되어 있습니다.자동 탈출이 그들의 가장 중요한 특징이라고 생각합니다...

는, 「Method 「Method」(메서드) 「Method」(메서드)에해 주세요.executemany커서의 오브젝트.다수의 쿼리를 정리하여 한 번에 실행하므로 성능이 향상됩니다.

해결책이 있다!

서버상의 스토어드 프로시저에 넣고 파이썬에서 이렇게 호출하면 사용할 수 있습니다.

cursor.callproc(Procedurename, args)

여기 mysql과 python의 스토어드 프로시저에 대한 작은 튜토리얼이 있습니다.

http://www.mysqltutorial.org/calling-mysql-stored-procedures-python/

언급URL : https://stackoverflow.com/questions/1947750/does-python-support-mysql-prepared-statements

반응형