찾다

 >  Q&A  >  본문

Python 커서가 저장 프로시저에서 결과를 검색할 수 없습니다.

<p>뭔가 이상한 이유로 Python 테스트 애플리케이션에서 callproc 호출 결과를 얻을 수 없습니다. MqSQL 5.2.47의 저장 프로시저는 다음과 같습니다. </p> <pre class="brush:php;toolbar:false;">CREATE PROCEDURE `mytestdb`.`getperson` (IN personid INT) 시작하다 person.person_id를 선택하고, 사람.사람_f이름, person.person_mi, 사람.사람_l이름, 사람.사람성별_ID, 사람.사람작업_ID 사람에게서 여기서 person.person_id = 개인 ID; 종료</pre> <p>이제 PyCharm과 Python 3.3을 사용하면 이 저장 프로시저를 호출할 때 아무것도 검색할 수 없는 것 같습니다. 이 코드는 내가 원하는 결과를 얻습니다. </p> <pre class="brush:php;toolbar:false;">mysql.connector 가져오기 cnx = mysql.connector.connect(사용자='루트', 호스트='127.0.0.1', 데이터베이스='mytestdb') cnx._open_connection() 커서 = cnx.cursor() 커서.execute("person.person_id = 1인 사람에서 * 선택") 사람 = 커서.fetchall() 사람 속의 사람을 위해: 인쇄(사람) cnx.close()</pre> <p>하지만 이 코드에는cursor.fetchall() 또는cursor.fetchone()이 있습니다...</p> <pre class="brush:php;toolbar:false;">mysql.connector 가져오기 cnx = mysql.connector.connect(사용자='루트', 호스트='127.0.0.1', 데이터베이스='mytestdb') cnx._open_connection() 커서 = cnx.cursor() 커서.callproc("getperson", [1]) 사람 = 커서.fetchall() 사람 속의 사람을 위해: 인쇄(사람) cnx.close()</pre> <p>..."mysql.connector.errors.InterfaceError: 얻을 수 있는 결과 세트가 없습니다."를 반환합니다.cursor.execute() 메서드를 사용하면 다음과 같은 이상한 동작이 추가로 발생합니다... </ p> <pre class="brush:php;toolbar:false;">mysql.connector 가져오기 cnx = mysql.connector.connect(사용자='루트', 호스트='127.0.0.1', 데이터베이스='mytestdb') cnx._open_connection() 커서 = cnx.cursor() 커서.execute("getperson(1) 호출") 사람 = 커서.fetchall() 사람 속의 사람을 위해: 인쇄(사람) cnx.close()</pre> <p> ..."mysql.connector.errors.InterfaceError: using cmd_query_iter for comments with multiple query" 다음에 "mysql.connector.errors.InterfaceError: using multi=True when running multiple questions"이 발생하기 때문입니다. 여러 결과 세트가 아닌 하나의 쿼리 결과만 반환한다는 사실입니다. MySQL Python 커넥터는 저장 프로시저에 대한 실행 호출을 이중 쿼리로 처리합니까? 저장 프로시저를 호출하고 결과를 얻으려면 어떻게 해야 합니까? 나는 내 코드에서 동적 SQL을 사용하고 싶지 않습니다. 어떤 조언이라도 미리 감사드립니다! </p>
P粉833546953P粉833546953459일 전627

모든 응답(2)나는 대답할 것이다

  • P粉523335026

    P粉5233350262023-08-25 11:31:10

    호출 후 저장 프로시저의 결과 가져오기 cursor.callproc는 다음 요소에 따라 달라집니다.

    • 호출 프로시저의 결과가 INOUT 또는 OUT 매개변수에 할당되는지 여부
    • 결과가 단일 행으로 구성되어 있는지 아니면 결과 집합(또는 여러 결과 집합)으로 구성되어 있는지 여부
    • 전화 걸기용 Python 패키지

    DBAPI Specification in 上有这样的说法光标.callproc:

    실제로 Cursor.callproc의 반환 값을 사용하는 것은 프로시저가 단일 행을 반환하고 열 수가 INOUT 및 OUT 매개 변수의 수와 일치하는 경우에만 작동하므로 결과 처리 방법에 몇 가지 변경 사항이 있습니다.


    주요 MySQL Python 커넥터 패키지(MySQL 커넥터, mysqlclient(MySQLdb)< /a> 및 PyMySQL)가 이러한 상황을 처리하는 방법은 다음과 같습니다. < /p>

    INOUT 또는 OUT 매개변수를 통해 반환된 단일 행 결과

    • MySQL Connectorcursor.callproc의 반환 값으로 입력 시퀀스의 수정된 복사본을 반환합니다. 값은 튜플입니다.

      으으으으
    • mysqlclientPyMySQL에서는 데이터베이스에 출력 매개변수를 쿼리한 다음 커서를 통해 결과를 가져와야 합니다. 값은 튜플의 튜플입니다. 쿼리할 매개변수 이름은 '@_{procedure_name}_{params.index(param)}'

      형식입니다. 으으으으

    단일 결과 집합에 있는 하나 이상의 행, INOUT 또는 OUT 매개변수가 정의되지 않음

    • MySQL 커넥터를 통해 커서의 stored_results 메소드(cursor.stored_resultsDBAPI 사양의 일부가 아님)

      으으으으
    • mysqlclientPyMySQL은 커서의 fetch* 메소드를 통해 결과를 노출합니다

      으으으으

    여러 결과 세트, INOUT 또는 OUT 매개변수가 정의되지 않음

    • MySQL 커넥터는 커서의 stored_results 메소드

      를 통해 결과를 노출합니다. 으으으으
    • mysqlclientPyMySQL에서는 다음 결과 세트로 이동하려면 cursor.nextset을 호출해야 합니다. 프로시저를 호출한 결과인 빈 결과 집합이 추가로 반환될 수 있습니다(cursor.nextset 检索结果集而不是仅调用 <代码>cursor.fetchall가 한 번 전달된 경우).

      으으으으

    버전 정보

    으아아아

    회신하다
    0
  • P粉005417748

    P粉0054177482023-08-25 10:38:33

    결과 세트 중 하나를 선택해 보셨나요?

    으아악

    stmt가 하나만 있어도 SELECT 여러 결과 세트를 할당할 수 있습니다. 나는 이것이 INOUT 및 OUT 변수가 반환되도록 허용하기 위해 PHP의 MySQLi 저장 프로시저에서 수행된다는 것을 알고 있습니다(다시 말하지만 그렇지 않지만 어쨌든 할당되고 있을 수 있습니다).

    내가 사용하고 있는(실행 중인) 전체 코드는 다음과 같습니다.

    으아악

    회신하다
    0
  • 취소회신하다