Python MySQL – Chamar procedimentos armazenados em Python

Resumo : neste tutorial, você aprenderá como chamar procedimentos armazenados MySQL em Python usando MySQL Connector/Python API.

Este tutorial continua de onde parou o tutorial Excluindo dados de uma tabela .

Antes de começarmos

Se você não estiver familiarizado com os procedimentos armazenados no MySQL ou quiser revisá-los para se atualizar, você pode seguir o tutorial de procedimentos armazenados do MySQL .

Criaremos dois procedimentos armazenados para demonstração neste tutorial:

  • find_all()– devolver todos os livros e autores
  • find_book_by_isbn()– retornar o título de um livro com base em seu ISBN.

1) O procedimento armazenado find_all()

Primeiro, crie um procedimento armazenado que recupere todos os livros e autores do pubbanco de dados:

USE pub;

DELIMITER $$

CREATE PROCEDURE find_all()
BEGIN
	SELECT 
		title, 
		isbn, 
        CONCAT(first_name,' ',last_name) AS author
	FROM books
	INNER JOIN book_author 
		ON book_author.book_id =  books.id
	INNER JOIN authors
		ON book_author.author_id = authors.id
	ORDER BY title;
END$$

DELIMITER ;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

find_all()procedimento armazenado possui uma SELECT instrução com INNER JOINcláusulas que recuperam o título, o ISBN e o nome completo do autor  booksde authorstabelas.

Segundo, chame o find_all()procedimento armazenado:

CALL find_all();Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

2) O procedimento armazenado find_by_isbn()

O seguinte procedimento cria o procedimento armazenado find_by_isbn()que localiza um livro com base em um ISBN:

DELIMITER $$

CREATE PROCEDURE find_by_isbn(
	IN p_isbn VARCHAR(13),
    OUT p_title VARCHAR(255)
)
BEGIN
	SELECT title 
    INTO p_title 
    FROM books
	WHERE isbn = p_isbn;
END$$

DELIMITER ;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

find_by_isbn()aceita dois parâmetros:

  • ISBN (parâmetro IN)
  • título (parâmetro OUT).

Ao passar um ISBN para o procedimento armazenado, você obterá o título do livro, por exemplo:

CALL find_by_isbn('1235927658929',@title);
SELECT @title;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Aqui está a saída:

+-------------------------------------------------+
| @title                                          |
+-------------------------------------------------+
| Debatable Land Between This World and the Next  |
+-------------------------------------------------+
1 row in set (0.00 sec)Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Chamando procedimentos armazenados em Python

Para chamar um procedimento armazenado em Python, siga estas etapas:

  • Primeiro, conecte-se ao banco de dados criando um novo MySQLConnectionobjeto.
  • Segundo, crie um novo objeto cursor a partir do objeto de conexão chamando o cursor()método.
  • Terceiro, chame  callproc()o método do MySQLCursorobjeto para executar o procedimento armazenado.
  • Por fim, feche o cursor e a conexão com o banco de dados como sempre.

1) Exemplo de chamada de procedimento armazenado

O exemplo a seguir demonstra como chamar o  find_all()procedimento armazenado em Python:

from mysql.connector import MySQLConnection, Error
from config import read_config

def find_all_books():
    try:
        # Read database configuration from the config file
        config = read_config()

        # Establish a connection to the MySQL database
        with MySQLConnection(**config) as conn:
            # Create a cursor to execute SQL queries
            with conn.cursor() as cursor:
                # Call the stored procedure 'find_all'
                cursor.callproc('find_all')

                # Process the results of the stored procedure
                results = []
                for result in cursor.stored_results():
                    results.append(result.fetchall())

                return results

    except Error as e:
        raise e

if __name__ == '__main__':
    try:
        result = find_all_books()
        print(result)
    except Error as e:
        print(e)
Linguagem de código:  Python  ( python )

Como funciona.

Primeiro, importe as classes necessárias ( MySQLConnectione Error) do mysql.connectormódulo e uma função read_configde um módulo chamado config:

from mysql.connector import MySQLConnection, Error
from config import read_config
Linguagem de código:  Python  ( python )

Segundo, defina uma função chamada find_all_books()que chamará o procedimento armazenado find_all():

def find_all_books():
   # ...Linguagem de código:  Python  ( python )

Dentro da find_all_books()função, chame o procedimento armazenado find_all()usando o callproc()procedimento armazenado, iterando o resultado do stored_results()método, buscando todas as linhas de cada conjunto de resultados e anexando-as à resultslista.

Terceiro, chame a find_all_books()função e exiba os conjuntos de resultados:

if __name__ == '__main__':
    try:
        result = find_all_books()
        print(result)
    except Error as e:
        print(e)Linguagem de código:  Python  ( python )

2) Chamando procedimento armazenado e passando argumentos

O exemplo a seguir mostra como chamar o  find_by_isbn()procedimento armazenado:

from mysql.connector import MySQLConnection, Error
from config import read_config

def find_book_by_isbn(isbn):
    args = (isbn, 0)
    try:
        # Read database configuration from the config file
        config = read_config()

        # Establish a connection to the MySQL database
        with MySQLConnection(**config) as conn:
            # Create a cursor to execute SQL queries
            with conn.cursor() as cursor:
                # Call the stored procedure 'find_by_isbn'
                result_args = cursor.callproc('find_by_isbn', args)
                book_title = result_args[1]
                return book_title

    except Error as e:
        print(e)
        raise e


if __name__ == '__main__':
    try:
        result = find_book_by_isbn('1236400967773')
        print(result)
    except Error as e:
        print(e)
Linguagem de código:  Python  ( python )

Saída:

The Giant on the Hill 

Neste exemplo, também usamos o callprocmétodo do objeto cursor para chamar um procedimento armazenado find_by_isbn.

Além disso, passamos um argumento para o callprocmétodo e obtemos o resultado como uma lista de tuplas com o primeiro elemento como ISBN e o segundo elemento como título de livro.

A find_book_by_isbn()função retorna o título do livro especificado pelo ISBN.

Resumo

  • Use o callproc()método de um objeto cursor para chamar procedimentos armazenados do MySQL em programas Python.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *