Python: Manipulando um Banco de Dados com SQLAlchemy
Flask-SQLAlchemy é uma extensão para o Flask que adiciona suporte para SQLAlchemy a suas aplicações. Ela combina a simplicidade e flexibilidade do Flask com o poder do SQLAlchemy, facilitando a criação e manipulação de bancos de dados em aplicações web. Então bora configurar e usar o Flask-SQLAlchemy.
Instalação
Primeiro, você deve instalar tanto o Flask quanto o Flask-SQLAlchemy. Use o seguinte comando no terminal:
pip install Flask Flask-SQLAlchemy
Configuração Inicial
Vamos começar criando uma aplicação Flask simples e configurando o Flask-SQLAlchemy.
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///ecommerce.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI']
: Define a URI do banco de dados SQLite.
db = SQLAlchemy(app)
: Cria uma instância do SQLAlchemy e a associa à aplicação Flask.
Criando Modelos
Em Flask-SQLAlchemy, você define modelos de banco de dados como classes Python. Cada classe representa uma tabela no banco de dados.
class Product(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), nullable=False) price = db.Column(db.Float, nullable=False) description = db.Column(db.Text, nullable=True)
class Usuario(db.Model)
: Define uma classeProduct
que herda dedb.Model
.
id = db.Column(db.Integer, primary_key=True)
: Define a colunaid
como a chave primária.
name = db.Column(db.String(80), nullable=False)
: Define a colunaname
como uma string com até 80 caracteres que não pode ser nula.
price = db.Column(db.Float, nullable=False)
: Define a colunaprice
como um inteiro que não pode ser nulo.
Inicializando o Banco de Dados e Criando tabelas
Após definir seus modelos, você deve criar as tabelas no banco de dados. Isso é feito chamando o método
create_all()
.with app.app_context(): db.create_all()
create_all
não atualiza tabelas se elas já estiverem no banco de dados. Se você alterar as colunas de um modelo, recomendo uma biblioteca de migração como Alembic com Flask-Alembic ou Flask-Migrate para gerar migrações que atualizem o esquema do banco de dados.Inserindo Dados
Vamos definir um rota API no Flask para adicionar novos produtos ao banco de dados:
from flask import Flask, request, jsonify
@app.route('/api/products/add', methods=["POST"]) def add_product(): data = request.json if 'name' in data and 'price' in data: new_product = Product( name=data["name"], price=data["price"], description=data.get("description", "")) db.session.add(new_product) db.session.commit() return jsonify({"message": "Produto cadastrado com sucesso"}) return jsonify({"message": "Dados do produto inválido!"}), 400
Vem comigo, bora entender o código 👇
A função
add_product()
é associada à rota /api/products/add
e aceita requisições HTTP POST. Quando uma requisição POST é recebida, a função extrai os dados JSON da requisição, cria uma nova instância do modelo Product
com esses dados, e adiciona essa instância à sessão do banco de dados. Em seguida, a transação é confirmada com db.session.commit()
, salvando o novo produto no banco de dados se os dados forem válidos assim retornando uma mensagem de sucesso; caso contrário, retorna uma mensagem de erro com código de status 400.Deletando Dados
Vamos definir um rota API no Flask para delete produtos existentes no banco de dados:
@app.route('/api/products/delete/<int:product_id>') def delete_product(product_id): #Recuperar o produto da base de dados product = Product.query.get(product_id) #Verificar se o produto existe ou não if product: #Se existe, apagar da base de dados db.session.delete(product) db.session.commit() return jsonify({"message": "Produto deletado com sucesso"}) #Se não existe, retornar 404 not found return jsonify({"message": "Produto não encontrado"}), 404
A rota
/api/products/delete/<int:product_id>
e aceita requisições HTTP DELETE. O <int:product_id>
é uma variável de rota que captura um inteiro da URL que é representado pelo id do produto a ser deletado.Aplicação Completa
Aqui está uma aplicação Flask completa que demonstra os passos acima:
from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///meubanco.db' db = SQLAlchemy(app) class Product(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), nullable=False) price = db.Column(db.Float, nullable=False) description = db.Column(db.Text, nullable=True) with app.app_context(): db.create_all() @app.route('/api/products/add', methods=["POST"]) def add_product(): #Obter os dados JSON da requisição data = request.json # Verificar se os campos 'name' e 'price' estão presentes nos dados if 'name' in data and 'price' in data: new_product = Product( name=data["name"], price=data["price"], # Usa um valor padrão vazio se 'description' não estiver presente description=data.get("description", "")) # Adicionar o novo produto à sessão do banco de dados db.session.add(new_product) # Confirmar a transação para salvar o produto no banco de dados db.session.commit() #Retornar uma resposta JSON indicando que o produto foi cadastrado com sucesso return jsonify({"message": "Produto cadastrado com sucesso"}) # Se os dados necessários não estiverem presentes, retornar uma resposta de erro return jsonify({"message": "Dados do produto inválido!"}), 400 @app.route('/api/products/delete/<int:product_id>') def delete_product(product_id): #Recuperar o produto da base de dados product = Product.query.get(product_id) #Verificar se o produto existe ou não if product: #Se existe, apagar da base de dados db.session.delete(product) db.session.commit() return jsonify({"message": "Produto deletado com sucesso"}) #Se não existe, retornar 404 not found return jsonify({"message": "Produto não encontrado"}), 404 if __name__ == '__main__': app.run(debug=True)
O Flask-SQLAlchemy simplifica a integração de bancos de dados em aplicações web Flask, oferecendo uma interface poderosa e fácil de usar para manipulação de dados. Este artigo cobriu os fundamentos da configuração, criação de tabelas, inserção, consulta, atualização e exclusão de dados usando Flask-SQLAlchemy. Com esses conhecimentos, você está pronto para construir aplicações web robustas e eficientes utilizando Flask e SQLAlchemy.