Neste tutorial, você aprenderá a criar uma API CRUD simples usando o framework Flask em Python e uma base de dados SQLite. Este tutorial abordará como criar as operações CRUD (Create, Read, Update, Delete) para gerenciar dados de nome e idade em uma base de dados SQLite.
Pré-requisitos
Antes de começar, certifique-se de ter o Python instalado em seu sistema. Você também precisará instalar o Flask, que pode ser feito usando o pip, o gerenciador de pacotes do Python. Além disso, assegure-se de ter um entendimento básico de como funciona o Flask e SQL.
Você pode instalar o Flask executando o seguinte comando no terminal:
pip install Flask
Passo 1: Criar o Banco de Dados SQLite e a Tabela
Primeiro, vamos criar um arquivo schema.sql para definir o esquema da tabela de dados. Crie um arquivo chamado schema.sql com o seguinte conteúdo:
CREATE TABLE IF NOT EXISTS dados (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
idade INTEGER NOT NULL
);
Este arquivo SQL cria uma tabela chamada dados com três colunas: id, nome e idade. O id é uma chave primária autoincrementada.
Passo 2: Configurar o Ambiente do Flask
Crie um arquivo chamado app.py e adicione o seguinte código para configurar a aplicação Flask:
# Importar o Flask
from flask import Flask
import sqlite3
# Criar uma instância da classe Flask
app = Flask(__name__)
# Configuração do banco de dados SQLite
DATABASE = 'database.db'
Este código importa o Flask e define uma instância da aplicação Flask. Também define o nome do arquivo de banco de dados SQLite.
Passo 3: Criar as Operações CRUD
Agora, vamos adicionar as operações CRUD para manipular os dados na base de dados SQLite. Adicione o seguinte código ao app.py:
# Função para conectar ao banco de dados
def get_db():
db = sqlite3.connect(DATABASE)
db.row_factory = sqlite3.Row
return db
# Função para criar a tabela de dados, se ela não existir
def init_db():
with app.app_context():
db = get_db()
with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit()
# Rota para criar a tabela de dados
@app.route('/initdb')
def initialize_database():
init_db()
return 'Database initialized'
Esta seção de código define funções para conectar ao banco de dados e criar a tabela de dados se ela não existir. Também cria uma rota para inicializar o banco de dados.
Passo 4: Implementar as Rotas da API
Agora, vamos implementar as rotas da API para manipular os dados. Adicione o seguinte código ao app.py:
@app.route('/')
def home():
return """
<h1>Bem-vindo à API CRUD com Flask</h1>
<p>Esta API permite que você execute operações CRUD (Create, Read, Update, Delete) em uma base de dados SQLite.</p>
<p>Rotas disponíveis:</p>
<ul>
<li>POST /dados - Adiciona um novo dado. Envie um JSON com os campos 'nome' e 'idade'.</li>
<li>GET /dados - Retorna todos os dados na base de dados.</li>
<li>GET /dados/{id} - Retorna um dado específico por ID.</li>
<li>PUT /dados/{id} - Atualiza um dado existente por ID. Envie um JSON com os campos 'nome' e 'idade'.</li>
<li>DELETE /dados/{id} - Deleta um dado existente por ID.</li>
</ul>
"""
# Rota para criar a tabela de dados
@app.route('/initdb')
def initialize_database():
init_db()
return 'Database initialized'
# Rota para adicionar um novo dado
@app.route('/dados', methods=['POST', 'GET'])
def manage_dados():
if request.method == 'POST':
nome = request.json.get('nome')
idade = request.json.get('idade')
if not nome or not idade:
return jsonify({'error': 'Nome e idade são obrigatórios'}), 400
try:
db = get_db()
cursor = db.cursor()
cursor.execute('INSERT INTO dados (nome, idade) VALUES (?, ?)', (nome, idade))
db.commit()
return jsonify({'message': 'Dado gravado com sucesso!'}), 201
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
elif request.method == 'GET':
return home()
# Rota para obter todos os dados
@app.route('/dados', methods=['GET'])
def get_dados():
try:
db = get_db()
cursor = db.cursor()
cursor.execute('SELECT * FROM dados')
dados = cursor.fetchall()
return jsonify([dict(row) for row in dados])
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
# Rota para obter um dado por ID
@app.route('/dados/<int:dado_id>', methods=['GET'])
def get_dado(dado_id):
try:
db = get_db()
cursor = db.cursor()
cursor.execute('SELECT * FROM dados WHERE id = ?', (dado_id,))
dado = cursor.fetchone()
if dado:
return jsonify(dict(dado))
else:
return jsonify({'error': 'Dado não encontrado'}), 404
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
# Rota para atualizar um dado por ID
@app.route('/dados/<int:dado_id>', methods=['PUT'])
def update_dado(dado_id):
nome = request.json.get('nome')
idade = request.json.get('idade')
if not nome or not idade:
return jsonify({'error': 'Nome e idade são obrigatórios'}), 400
try:
db = get_db()
cursor = db.cursor()
cursor.execute('UPDATE dados SET nome = ?, idade = ? WHERE id = ?', (nome, idade, dado_id))
db.commit()
return jsonify({'message': 'Dado atualizado com sucesso!'})
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
# Rota para deletar um dado por ID
@app.route('/dados/<int:dado_id>', methods=['DELETE'])
def delete_dado(dado_id):
try:
db = get_db()
cursor = db.cursor()
cursor.execute('DELETE FROM dados WHERE id = ?', (dado_id,))
db.commit()
return jsonify({'message': 'Dado deletado com sucesso!'})
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
# Iniciar a aplicação Flask
if __name__ == '__main__':
app.run(debug=True)
Esta seção de código implementa as rotas da API para adicionar, obter, atualizar e deletar dados. A rota inicial fornece uma descrição da API e suas rotas disponíveis.
Passo 5: Executar a Aplicação Flask
Agora que a aplicação Flask está completa, você pode executá-la. No terminal, navegue até o diretório onde o arquivo app.py está localizado e execute o seguinte comando:
python app.py
Agora, sua API CRUD estará em execução e você poderá acessá-la em http://localhost:5000. Você pode usar um cliente REST como o Postman para testar as diferentes rotas da API.
CODIGO COMPLETO:
# Importar o Flask
from flask import Flask, request, jsonify
import sqlite3
# Criar uma instância da classe Flask
app = Flask(__name__)
# Configuração do banco de dados SQLite
DATABASE = 'database.db'
# Função para conectar ao banco de dados
def get_db():
db = sqlite3.connect(DATABASE)
db.row_factory = sqlite3.Row
return db
# Função para criar a tabela de dados, se ela não existir
def init_db():
with app.app_context():
db = get_db()
with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit()
# Rota inicial para explicar o uso da API
@app.route('/')
def home():
return """
<h1>Bem-vindo à API CRUD com Flask</h1>
<p>Esta API permite que você execute operações CRUD (Create, Read, Update, Delete) em uma base de dados SQLite.</p>
<p>Rotas disponíveis:</p>
<ul>
<li>POST /dados - Adiciona um novo dado. Envie um JSON com os campos 'nome' e 'idade'.</li>
<li>GET /dados - Retorna todos os dados na base de dados.</li>
<li>GET /dados/{id} - Retorna um dado específico por ID.</li>
<li>PUT /dados/{id} - Atualiza um dado existente por ID. Envie um JSON com os campos 'nome' e 'idade'.</li>
<li>DELETE /dados/{id} - Deleta um dado existente por ID.</li>
</ul>
"""
# Rota para criar a tabela de dados
@app.route('/initdb')
def initialize_database():
init_db()
return 'Database initialized'
# Rota para adicionar um novo dado
@app.route('/dados', methods=['POST', 'GET'])
def manage_dados():
if request.method == 'POST':
nome = request.json.get('nome')
idade = request.json.get('idade')
if not nome or not idade:
return jsonify({'error': 'Nome e idade são obrigatórios'}), 400
try:
db = get_db()
cursor = db.cursor()
cursor.execute('INSERT INTO dados (nome, idade) VALUES (?, ?)', (nome, idade))
db.commit()
return jsonify({'message': 'Dado gravado com sucesso!'}), 201
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
elif request.method == 'GET':
return home()
# Rota para obter todos os dados
@app.route('/dados', methods=['GET'])
def get_dados():
try:
db = get_db()
cursor = db.cursor()
cursor.execute('SELECT * FROM dados')
dados = cursor.fetchall()
return jsonify([dict(row) for row in dados])
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
# Rota para obter um dado por ID
@app.route('/dados/<int:dado_id>', methods=['GET'])
def get_dado(dado_id):
try:
db = get_db()
cursor = db.cursor()
cursor.execute('SELECT * FROM dados WHERE id = ?', (dado_id,))
dado = cursor.fetchone()
if dado:
return jsonify(dict(dado))
else:
return jsonify({'error': 'Dado não encontrado'}), 404
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
# Rota para atualizar um dado por ID
@app.route('/dados/<int:dado_id>', methods=['PUT'])
def update_dado(dado_id):
nome = request.json.get('nome')
idade = request.json.get('idade')
if not nome or not idade:
return jsonify({'error': 'Nome e idade são obrigatórios'}), 400
try:
db = get_db()
cursor = db.cursor()
cursor.execute('UPDATE dados SET nome = ?, idade = ? WHERE id = ?', (nome, idade, dado_id))
db.commit()
return jsonify({'message': 'Dado atualizado com sucesso!'})
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
# Rota para deletar um dado por ID
@app.route('/dados/<int:dado_id>', methods=['DELETE'])
def delete_dado(dado_id):
try:
db = get_db()
cursor = db.cursor()
cursor.execute('DELETE FROM dados WHERE id = ?', (dado_id,))
db.commit()
return jsonify({'message': 'Dado deletado com sucesso!'})
except sqlite3.Error as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
# Iniciar a aplicação Flask
if __name__ == '__main__':
app.run(debug=True)
Top comments (2)
eu teria que cria um novo arquivo para por esse segundo codigo?
sim sim, eu deixei o segundo arquivo como app.py
o primeiro arquivo é responsável somente por criar a base de dados