Con trỏ Python được lưu trữ_results

Các thủ tục được lưu trữ của MySQL có thể trả về nhiều tập kết quả. Trong bài đăng này, chúng tôi đang xem xét việc gọi thủ tục được lưu trữ đó; . Chúng tôi đang sử dụng SQLAlchemy và ba ( 3 ) gói trình kết nối sau. mysqlclient, PyMySQL và mysql-connector-python. mysqlclient và PyMySQL xử lý nhiều tập kết quả theo cách tương tự, trong khi mysql-connector-python thực hiện theo cách khác

Trang SQLAlchemy này MySQL và MariaDB liệt kê một số gói trình kết nối MySQL Python, nhưng những gói được đề cập trước đó nằm ở đầu danh sách và dường như là những gói được nhắc đến nhiều nhất trên các diễn đàn. Đây là những lý do tại sao tôi chọn chúng cho nghiên cứu này. trang web của họ. mysql-connector-python, mysqlclient và PyMySQL

Cơ sở dữ liệu nguồn là dữ liệu thử nghiệm MySQL do Tập đoàn Oracle phát hành. Có thể tải xuống từ https. //github. com/datacharmer/test_db. Nó là một cơ sở dữ liệu đơn giản chỉ với một vài bảng, dễ cài đặt

Dưới đây là quy trình được lưu trữ mà chúng tôi đang sử dụng trong bài đăng này

delimiter // drop procedure if exists DemoStoredProc1; // create procedure DemoStoredProc1( pm_dept_no varchar(4) ) reads sql data begin select * from departments where dept_no = pm_dept_no; select * from dept_manager where dept_no = pm_dept_no; end; //

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Nếu trùng khớp, tập bản ghi đầu tiên sẽ chỉ có một bản ghi duy nhất, tập bản ghi thứ hai sẽ có một hoặc nhiều bản ghi. chúng là hai ( 2 ) bộ bản ghi riêng biệt. Xin lưu ý, chúng tôi có thể có nhiều hơn hai, nhưng với mục đích của bài đăng này, hai là đủ

Tôi muốn trích xuất tên cột và bản ghi thành danh sách đa chiều như minh họa bên dưới

[ [ ['dept_no', 'dept_name'], ['d001', 'Marketing'] ], [ ['emp_no', 'dept_no', 'from_date', 'to_date'], [110022, 'd001', datetime.date(1985, 1, 1), datetime.date(1991, 10, 1)], [110039, 'd001', datetime.date(1991, 10, 1), datetime.date(9999, 1, 1)] ] ]

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Đó là

  • Mỗi bộ bản ghi được trả về nằm trong danh sách riêng của nó. Và trong danh sách này
    • Phần tử đầu tiên là danh sách các tên cột
    • Các phần tử tiếp theo là danh sách các bản ghi dữ liệu
  • Tất cả danh sách bộ bản ghi được lưu trữ trong một danh sách khác

Khi không có dữ liệu, chỉ tên cột được trích xuất

[ [ ['dept_no', 'dept_name'] ], [ ['emp_no', 'dept_no', 'from_date', 'to_date'] ] ]

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Không thể trả về kết quả từ thủ tục được lưu trữ bằng con trỏ Python là bài đăng chính giúp tôi tìm ra cách hoạt động của mysqlclient và PyMySQL

mysql-connector-python

MySQLCon trỏ. phương thức stored_results() cung cấp quyền truy cập vào các tập kết quả riêng lẻ

from sqlalchemy import create_engine from contextlib import closing engine = create_engine( 'mysql+mysqlconnector://behai:super-secret-password@localhost/employees', echo = False ) connection = engine.raw_connection() try: with closing( connection.cursor() ) as cursor: cursor.callproc( 'DemoStoredProc1', [ 'd001' ] ) data = [] for sr in cursor.stored_results(): #-- columns = [ column[0] for column in sr.description ] ds = sr.fetchall() dataset = [] dataset.append( columns ) for row in ds: dataset.append( list(row) ) data.append( dataset ) #-- sr.close() cursor.close() import pprint print( '\n' ) pprint.pprint( data ) except Exception as e: print( f'Exception. Type {type(e)}: {str(e)}' ) finally: if 'connection' in locals(): connection.close()

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Mỗi iterator được trả về bởi MySQLCursor. stored_results() là một lớp MySQLCursor, trong đó MySQLCursor. thuộc tính mô tả cung cấp quyền truy cập vào thông tin cột. Phần còn lại của các mã nên tự giải thích

mysqlclient và PyMySQL

các lớp con trỏ mysqlclient và PyMySQL không triển khai phương thức stored_results(). Thay vào đó, họ thực hiện phương pháp. Tài liệu tương ứng của họ và Đối tượng con trỏ PyMySQL

vòng lặp dựa trên nextset() không tao nhã bằng việc lặp lại với stored_results()

from sqlalchemy import create_engine from contextlib import closing # mysqlclient engine = create_engine( 'mysql://behai:super-secret-password@localhost/employees', echo = False ) # PyMySQL engine = create_engine( 'mysql+pymysql://behai:super-secret-password@localhost/employees', echo = False ) connection = engine.raw_connection() try: with closing( connection.cursor() ) as cursor: cursor.callproc( 'DemoStoredProc1', [ 'd001' ] ) data = [] ns = cursor while ns != None: if ( cursor.description != None ): #-- columns = [ column[0] for column in cursor.description ] ds = cursor.fetchall() dataset = [] dataset.append( columns ) for row in ds: dataset.append( list(row) ) data.append( dataset ) #-- ns = cursor.nextset() cursor.close() import pprint print( '\n' ) pprint.pprint( data ) except Exception as e: print( f'Exception. Type {type(e)}: {str(e)}' ) finally: if 'connection' in locals(): connection.close()

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Theo các tài liệu, tôi không cần điều kiện

if ( cursor.description != None ):

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Nhưng không có nó, vòng lặp sẽ dẫn đến một ngoại lệ khi ở cuối. Tôi vẫn chưa thể làm việc đó. và có lẽ sẽ không bao giờ. Tôi không sử dụng hai gói này

Cá nhân, tôi thích mysql-connector-python nhất. tài liệu phong phú và nó được viết bởi chính MySQL và do đó có khả năng luôn được cập nhật

Tôi nhìn vào điều này vì tò mò. Tôi chưa tận dụng tính năng này của MySQL trong bất kỳ dự án nào. Tôi hy vọng bạn thấy nó hữu dụng. Cảm ơn bạn đã đọc và giữ an toàn như mọi khi

Chủ đề