Vou criar um exemplo completo de *Banco de dados MySQL** para um sistema simples de gerenciamento de uma biblioteca. Incluirei tabelas, relacionamentos, inserção de dados e consultas básicas.
---
### **1. Criação do Banco de Dados**
```sql
-- Cria o banco de dados
CREATE DATABASE IF NOT EXISTS Biblioteca;
USE Biblioteca;
```
---
### **2. Criação das Tabelas**
#### **Tabela `Usuarios`** (Armazena informações dos usuários)
```sql
CREATE TABLE IF NOT EXISTS Usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
telefone VARCHAR(20),
data_cadastro DATE DEFAULT (CURRENT_DATE)
);
```
#### **Tabela `Livros`** (Armazena informações dos livros)
```sql
CREATE TABLE IF NOT EXISTS Livros (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(200) NOT NULL,
autor VARCHAR(100) NOT NULL,
ano_publicacao INT,
isbn VARCHAR(20) UNIQUE NOT NULL,
disponivel BOOLEAN DEFAULT TRUE
);
```
#### **Tabela `Emprestimos`** (Registra empréstimos de livros)
```sql
CREATE TABLE IF NOT EXISTS Emprestimos (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario_id INT NOT NULL,
livro_id INT NOT NULL,
data_emprestimo DATE DEFAULT (CURRENT_DATE),
data_devolucao DATE,
FOREIGN KEY (usuario_id) REFERENCES Usuarios(id),
FOREIGN KEY (livro_id) REFERENCES Livros(id)
);
```
---
### **3. Inserção de Dados de Exemplo**
#### **Inserir usuários:**
```sql
INSERT INTO Usuarios (nome, email, telefone)
VALUES
('Ana Silva', 'ana@email.com', '(11) 9999-8888'),
('Carlos Souza', 'carlos@email.com', '(21) 7777-6666');
```
#### **Inserir livros:**
```sql
INSERT INTO Livros (titulo, autor, ano_publicacao, isbn)
VALUES
('Dom Casmurro', 'Machado de Assis', 1899, '978-85-1234-567-8'),
('1984', 'George Orwell', 1949, '978-85-4321-987-6');
```
#### **Registrar empréstimo:**
```sql
INSERT INTO Emprestimos (usuario_id, livro_id, data_devolucao)
VALUES
(1, 1, DATE_ADD(CURRENT_DATE, INTERVAL 7 DAY)); -- Ana empresta "Dom Casmurro"
```
---
### **4. Consultas Básicas**
#### **Listar todos os livros disponíveis:**
```sql
SELECT titulo, autor FROM Livros WHERE disponivel = TRUE;
```
#### **Listar empréstimos ativos:**
```sql
SELECT
U.nome AS Usuario,
L.titulo AS Livro,
E.data_emprestimo,
E.data_devolucao
FROM Emprestimos E
JOIN Usuarios U ON E.usuario_id = U.id
JOIN Livros L ON E.livro_id = L.id
WHERE E.data_devolucao > CURRENT_DATE;
```
---
### **5. Stored Procedures (Exemplo)**
#### **Procedure para realizar empréstimo:**
```sql
DELIMITER //
CREATE PROCEDURE RealizarEmprestimo(
IN usuario_id INT,
IN livro_id INT,
IN dias_emprestimo INT
)
BEGIN
INSERT INTO Emprestimos (usuario_id, livro_id, data_devolucao)
VALUES (usuario_id, livro_id, DATE_ADD(CURRENT_DATE, INTERVAL dias_emprestimo DAY));
UPDATE Livros SET disponivel = FALSE WHERE id = livro_id;
END //
DELIMITER ;
-- Chamada da procedure:
CALL RealizarEmprestimo(2, 2, 14); -- Carlos empresta "1984" por 14 dias
```
---
### **6. Triggers (Exemplo)**
#### **Atualizar disponibilidade após devolução:**
```sql
DELIMITER //
CREATE TRIGGER AtualizarDisponibilidade
AFTER UPDATE ON Emprestimos
FOR EACH ROW
BEGIN
IF NEW.data_devolucao <= CURRENT_DATE THEN
UPDATE Livros SET disponivel = TRUE WHERE id = NEW.livro_id;
END IF;
END //
DELIMITER ;
```
---
### **7. Índices para Otimização**
```sql
CREATE INDEX idx_livros_titulo ON Livros(titulo);
CREATE INDEX idx_usuarios_email ON Usuarios(email);
```
---
### **8. Python + MySQL (Exemplo de Conexão)**
```python
import mysql.connector
from mysql.connector import Error
try:
conexao = mysql.connector.connect(
host='localhost',
database='Biblioteca',
user='seu_usuario',
password='sua_senha'
)
cursor = conexao.cursor()
cursor.execute("SELECT titulo, autor FROM Livros")
for (titulo, autor) in cursor:
print(f"Livro: {titulo}, Autor: {autor}")
except Error as e:
print(f"Erro: {e}")
finally:
if conexao.is_connected():
cursor.close()
conexao.close()
```
---
### **Principais Conceitos Abordados**:
1. **Modelagem Relacional**: Chaves primárias, estrangeiras e relacionamentos.
2. **SQL Básico**: CRUD (Create, Read, Update, Delete).
3. **Programação no Banco**: Stored procedures e triggers.
4. **Otimização**: Índices para consultas rápidas.
5. **Integração com Python**: Conexão básica.
---
### **Dicas Extras**:
- **Segurança**: Use variáveis de ambiente para armazenar credenciais do banco.
- **Backup**: Configure backups automáticos com `mysqldump`.
- **ORM**: Para projetos maiores, considere usar bibliotecas como `SQLAlchemy`.
Comentários
Postar um comentário