Python: MySQL 저장 프로시저에서 열 이름과 데이터를 추출하는 SQLAlchemy는 데이터 세트를 반환했습니다.

Python용 SQLAlchemy 라이브러리 사용, MySQL 저장 프로시저 실행 방법, 반환된 저장 프로시저에서 열 이름 및 데이터 추출 데이터 세트.

나는 지금 아주 잠시 동안 SQLAlchemy 라이브러리를 사용하고 있습니다. MySQL 저장 프로시저를 실행하는 방법을 배우는 것은 그리 어렵지 않았습니다. 그러나 이 라이브러리의 특정 측면에 대한 정보를 찾는 것이 어려울 수 있다고 생각합니다. 개인적으로 지금까지 배우기 가장 힘든 데이터베이스 라이브러리입니다.

MySQL 저장 프로시저에 의해 반환된 데이터 세트에서 열 이름을 추출할 수 있으려면 약간의 검색이 필요했습니다... 내가 본 게시물 중 일부에서 제안한 솔루션은 저에게 적합하지 않았습니다. 작동하는 것은 Calling MySQL stored procedure in python with field names by user mathieu FERAUD 입니다. 간단한 예제 저장 프로시저로 이를 문서화하고 있습니다.

다음은 MySQL 저장 프로시저의 단순화된 버전이며 단일 행만 반환하지만 중요하지 않습니다.

delimiter //

drop procedure if exists DemoStoredProc; //

create procedure DemoStoredProc( userId int, timesheetId int, 
                                 searchType varchar(10), roundDir varchar(4) )
                                 reads sql data
begin
  declare TOTAL_HOURS int;
  declare TOTAL_MINUTES int;
  declare ROUNDED_HOUR float(5,2);  

  set TOTAL_HOURS = 11;
  set TOTAL_MINUTES = 44;  
  set ROUNDED_HOUR = 0.5;  

  select TOTAL_HOURS, TOTAL_MINUTES, TOTAL_HOURS + ROUNDED_HOUR as ROUNDED_TOTAL_HOURS;  
end; //


Python 예제에서 스크립트는 최종 데이터 세트에 몇 개의 행이 있는지 가정하지 않습니다.

File sqlalchemy-stored-proc.py:



from sqlalchemy import create_engine
from contextlib import closing

engine = create_engine( 'mysql+mysqlconnector://behai1:password@localhost/ompdev1', echo = False )
connection = engine.raw_connection()

try:
    with closing( connection.cursor() ) as cursor:
        cursor.callproc( 'DemoStoredProc', [ 1, 111, 'all', 'down' ] )

        result = next( cursor.stored_results() )
        dataset = result.fetchall()
        has_data = len( dataset ) > 0

        if has_data:
            """
            Copying columns names into a list.

            Reference:
                https://dba.stackexchange.com/questions/198216/calling-mysql-stored-procedure-in-python-with-field-names
                Calling MySQL stored procedure in python with field names

                mathieu FERAUD -- https://dba.stackexchange.com/users/207207/mathieu-feraud
            """

            for column_id in cursor.stored_results():
                columns_properties = ( column_id.description )
                columns = [ column[0] for column in columns_properties ]

            data = []
            for row in dataset:
                record = {}
                for idx, name in enumerate( columns ):
                    record[ name ] = row[ idx ]
                data.append( record )

except Exception as e:
    has_data = False
    print( 'Exception. Type {}', type(e), '--', str(e) )
finally:
    if 'result' in locals():
        result.close()

    if 'conn' in locals():
        conn.close()

    if has_data:
        import pprint
        print( '\n' )
        pprint.pprint( data )
    else:
        print( '\nI am sorry...there is no data to print.\n' )


기본적으로 각 행은 열 이름을 키 이름으로 하는 사전으로 변환됩니다. 그리고 사전이 목록에 추가됩니다. 마지막으로 목록이 인쇄됩니다.

열 이름을 추출하기 전에 실제로 다른 모든 작업을 수행했습니다. 저는 몰랐고 cursor.stored_results()를 가리키는 정보를 찾을 수 없었습니다.

솔루션을 검색할 때 읽은 게시물의 다른 게시물에서도 이와 동일한 문제가 있는 것으로 보입니다. 심지어 해킹이 제안된 혼란도 있습니다. cursor.description 사용을 제안하는 게시물이 있습니다. 시도했습니다.

...
    with closing( connection.cursor() ) as cursor:
        cursor.callproc( 'DemoStoredProc', [1, 111, 'all', 'up'] )

        for field in cursor.description:
            print( field )
...         



('DemoStoredProc_arg1', 8, None, None, None, None, 1, 32896, 63)
('DemoStoredProc_arg2', 8, None, None, None, None, 1, 32896, 63)
('DemoStoredProc_arg3', 251, None, None, None, None, 1, 0, 255)
('DemoStoredProc_arg4', 251, None, None, None, None, 1, 0, 255)



It is the stored procedure's argument information, not the 
returned column name information.


다음을 사용하여 위의 스크립트를 실행할 수 있습니다.

(venv) F:\project_xyz>venv\Scripts\python.exe sqlalchemy-stored-proc.py


그리고 우리는 예상대로 결과를 얻었습니다.

[{'ROUNDED_TOTAL_HOURS': 11.5, 'TOTAL_HOURS': 11, 'TOTAL_MINUTES': 44}]


이 게시물이 도움이 되었기를 바랍니다. 읽어 주셔서 감사합니다. 행복한 프로그래밍과 안전을 유지하십시오.

좋은 웹페이지 즐겨찾기