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 autoresfind_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 pub
banco 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 )
O find_all()
procedimento armazenado possui uma SELECT
instrução com INNER JOIN
cláusulas que recuperam o título, o ISBN e o nome completo do autor books
de authors
tabelas.
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 )
O 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
MySQLConnection
objeto. - Segundo, crie um novo objeto cursor a partir do objeto de conexão chamando o
cursor()
método. - Terceiro, chame
callproc()
o método doMySQLCursor
objeto 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 ( MySQLConnection
e Error
) do mysql.connector
módulo e uma função read_config
de 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 à results
lista.
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 callproc
método do objeto cursor para chamar um procedimento armazenado find_by_isbn
.
Além disso, passamos um argumento para o callproc
mé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.