0% acharam este documento útil (0 voto)
10 visualizações8 páginas

Procedures Functions e Triggers

Triggers - SQL
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
10 visualizações8 páginas

Procedures Functions e Triggers

Triggers - SQL
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 8

Para utilizar uma function ou procedure do PostgreSQL no Python, você

pode utilizar a biblioteca psycopg2 , que permite a comunicação entre o


Python e o banco de dados PostgreSQL.

Aqui estão os passos e um exemplo prático:

Passos:
1. Instalar a biblioteca psycopg2 : Se você ainda não a tem instalada, use
o seguinte comando:

pip install psycopg2

2. Conectar ao banco de dados: Utilize a biblioteca psycopg2 para


conectar ao PostgreSQL.

3. Executar a function ou procedure: Você pode usar a função


callproc() para procedures ou execute() para functions.

Exemplo de uso de uma function no Python:

Função no PostgreSQL:

Vamos supor que você tenha a seguinte função no PostgreSQL:

CREATE FUNCTION calcular_idade(data_nascimento DATE)


RETURNS INTEGER
LANGUAGE plpgsql
AS $$
BEGIN
RETURN EXTRACT(YEAR FROM AGE(data_nascimento));
END;
$$;

Código Python para chamar a função:

import psycopg2

# Conectar ao banco de dados PostgreSQL


conn = psycopg2.connect(
host="localhost",
database="seu_banco_de_dados",
user="seu_usuario",
password="sua_senha"
)

# Criar um cursor para executar as consultas


cur = conn.cursor()

# Definir o valor do parâmetro da função


data_nascimento = '1985-10-08'

# Executar a função calcular_idade


cur.execute("SELECT calcular_idade(%s)", (data_nascimento,))

# Obter o resultado
idade = cur.fetchone()[0]

print(f"A idade é: {idade} anos.")

# Fechar a conexão e o cursor


cur.close()
conn.close()

Exemplo de uso de uma procedure no Python:

Procedure no PostgreSQL:

Vamos supor que você tenha a seguinte procedure no PostgreSQL:

CREATE PROCEDURE inserir_usuario(nome TEXT, email TEXT)


LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO usuarios (nome, email) VALUES (nome, email);
END;
$$;

Código Python para chamar a procedure:

import psycopg2

# Conectar ao banco de dados PostgreSQL


conn = psycopg2.connect(
host="localhost",
database="seu_banco_de_dados",
user="seu_usuario",
password="sua_senha"
)

# Criar um cursor para executar a procedure


cur = conn.cursor()

# Definir os valores dos parâmetros da procedure


nome = 'Sandro'
email = '[email protected]'

# Chamar a procedure
cur.callproc('inserir_usuario', (nome, email))

# Commitar a transação
conn.commit()

print("Usuário inserido com sucesso.")

# Fechar a conexão e o cursor


cur.close()
conn.close()

Resumo:
execute() é utilizado para chamar functions e selects.

callproc() é utilizado para chamar procedures.

Esse fluxo permite que você se conecte ao PostgreSQL, execute funções e


procedures diretamente do seu código Python e manipule os resultados ou
faça alterações no banco de dados.

A eficiência ao utilizar functions e procedures do PostgreSQL a partir do


Python depende de vários fatores, como a natureza das operações que você
está realizando, a estrutura da sua aplicação e a forma como você gerencia
as conexões e transações. Aqui estão algumas abordagens para melhorar a
eficiência e performance ao trabalhar com banco de dados em Python:

1. Conexão Persistente (Pooling de Conexões)


Criar uma nova conexão com o banco de dados toda vez que você faz uma
operação pode ser ineficiente. Uma boa prática é usar um pool de
conexões, que mantém várias conexões abertas e reutiliza-as para novas
operações, em vez de criar uma nova conexão toda vez.

Para isso, você pode usar a biblioteca psycopg2 com o módulo pool ou
bibliotecas como SQLAlchemy com suporte nativo ao pooling.

Exemplo com psycopg2.pool :

import psycopg2
from psycopg2 import pool

# Criar um pool de conexões


connection_pool = psycopg2.pool.SimpleConnectionPool(1, 10,
host="localhost",
database="seu_banco_de_dados",
user="seu_usuario",
password="sua_senha"
)

# Obter uma conexão do pool


conn = connection_pool.getconn()

# Criar um cursor e executar uma função


cur = conn.cursor()
cur.execute("SELECT calcular_idade(%s)", ('1985-10-08',))
idade = cur.fetchone()[0]

# Liberar a conexão de volta para o pool


connection_pool.putconn(conn)

print(f"A idade é: {idade} anos.")

Com pooling de conexões, você evita o overhead de abrir e fechar uma


nova conexão repetidamente, o que melhora o desempenho em aplicações
que fazem muitas operações de banco de dados.

2. Batching de Operações
Se você precisa realizar muitas inserções, atualizações ou chamadas de
funções, agrupar essas operações em um lote pode ser mais eficiente do
que executar uma de cada vez. Isso reduz a sobrecarga de envio de
múltiplas requisições ao banco de dados.

Exemplo de Inserções em Batch:

import psycopg2

# Conectar ao banco de dados PostgreSQL


conn = psycopg2.connect(
host="localhost",
database="seu_banco_de_dados",
user="seu_usuario",
password="sua_senha"
)

cur = conn.cursor()

# Exemplo de inserções em batch


data = [
('Sandro', '[email protected]'),
('Ana', '[email protected]'),
('João', '[email protected]')
]

cur.executemany("CALL inserir_usuario(%s, %s)", data)

# Commitar a transação
conn.commit()

# Fechar a conexão e o cursor


cur.close()
conn.close()

3. Uso de Transações
Agrupar múltiplas operações dentro de uma única transação (usando
BEGIN e COMMIT ) é mais eficiente do que executar cada operação
separadamente. Quando o PostgreSQL faz uma operação, ele precisa
gerenciar o estado de transação, então consolidar várias operações em uma
única transação reduz essa carga.

Exemplo de Transação:
conn = psycopg2.connect(
host="localhost",
database="seu_banco_de_dados",
user="seu_usuario",
password="sua_senha"
)

cur = conn.cursor()

# Iniciar a transação
conn.autocommit = False

try:
cur.execute("CALL inserir_usuario(%s, %s)", ('Sandro', 'sandro@ema
cur.execute("CALL inserir_usuario(%s, %s)", ('Ana', '[email protected]

# Commitar as operações
conn.commit()
except Exception as e:
# Fazer rollback em caso de erro
conn.rollback()
print(f"Erro: {e}")
finally:
cur.close()
conn.close()

 

4. Chamar Procedures/Functions para Lógica Complexa no


Banco de Dados
Ao executar lógica complexa, como cálculos, agregações ou várias
operações de escrita/leitura no banco de dados, é mais eficiente mover essa
lógica para procedures e functions no próprio banco de dados. Isso evita a
necessidade de transferir grandes quantidades de dados entre o banco e a
aplicação.

Exemplo:

Em vez de buscar dados, processá-los no Python e depois enviar resultados


de volta, você pode fazer o processamento diretamente em uma função no
PostgreSQL e apenas retornar o resultado final.
CREATE FUNCTION processar_dados_complexos()
RETURNS TABLE (id INTEGER, resultado TEXT)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT id, CONCAT(nome, ' - ', email)
FROM usuarios
WHERE LENGTH(nome) > 5;
END;
$$;

Código Python para chamar a função:

cur.execute("SELECT * FROM processar_dados_complexos()")


resultados = cur.fetchall()

5. Minimizar Transferência de Dados


Transferir grandes volumes de dados entre o banco de dados e a aplicação
é caro em termos de tempo e recursos. Sempre que possível, utilize filtros e
agregações no SQL para reduzir a quantidade de dados transferidos.

cur.execute("SELECT nome, email FROM usuarios WHERE LENGTH(nome) > %s"

 

Conclusão:
Para tornar o uso de functions e procedures mais eficiente no Python:

1. Use pooling de conexões para evitar a criação e fechamento repetitivo


de conexões.
2. Agrupe operações em batches e utilize transações para consolidar
múltiplas operações.
3. Execute lógica complexa diretamente no banco de dados usando
functions e procedures.
4. Minimize a transferência de dados processando e filtrando o máximo
possível no PostgreSQL.
Essas práticas aumentam a eficiência e reduzem o tempo de resposta das
operações no banco de dados, melhorando a performance da sua aplicação
como um todo.

Você também pode gostar