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
'source' 카테고리의 다른 글
| 'SELECT' 문의 'IF' - 열 값을 기준으로 출력 값 선택 (0) | 2023.01.15 |
|---|---|
| php로 날짜/시간에서 년/월/일을 가져오시겠습니까? (0) | 2023.01.15 |
| PHP에서 가중치별로 랜덤 결과를 생성하시겠습니까? (0) | 2023.01.15 |
| php의 "include"와 "require"의 차이 (0) | 2023.01.15 |
| 하위 쿼리에 그룹 열이 있을 때 MySQL 8이 INDEX를 사용하지 않습니다. (0) | 2023.01.15 |