Café y Código

5. Bases de Datos con SQLAlchemy

¿Qué es Flask-SQLAlchemy?

Flask-SQLAlchemy es una extensión que simplifica el uso del ORM (Mapeador Relacional de Objetos) SQLAlchemy dentro de aplicaciones Flask. Permite mapear clases de Python a tablas de la base de datos SQL sin escribir SQL manual.

instalar_sqlalchemy.sh
BASH
1pip install flask-sqlalchemy

Conexión a distintas Bases de Datos

La gran ventaja de Flask-SQLAlchemy es que la lógica del modelo no cambia; solo cambia la cadena de conexión SQLALCHEMY_DATABASE_URI en app.config.

  • SQLite (Local): sqlite:///mi_base.db (ideal para pruebas rápidas).
  • MySQL: mysql+pymysql://usuario:password@localhost:3306/nombre_bd
  • Supabase (Postgres): postgresql://postgres.[ref]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres

1. CRUD en Flask con MySQL

Para conectar Flask a un servidor **MySQL**, primero instalamos el driver pymysql:

instalar_mysql.sh
BASH
1pip install flask-sqlalchemy pymysql cryptography

Luego configuramos la URI de conexión y ejecutamos las operaciones CRUD:

flask_mysql_crud.py
PYTHON
1from flask import Flask
2from flask_sqlalchemy import SQLAlchemy
3
4app = Flask(__name__)
5
6# Configuración de conexión a MySQL local o servidor remoto
7app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:secreto123@localhost:3306/tienda_db'
8app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
9
10db = SQLAlchemy(app)
11
12
13# Modelo de datos en MySQL
14class Producto(db.Model):
15 __tablename__ = 'productos'
16 id = db.Column(db.Integer, primary_key=True)
17 nombre = db.Column(db.String(100), nullable=False)
18 precio = db.Column(db.Float, nullable=False)
19 stock = db.Column(db.Integer, default=0)
20
21
22# CRUD Completo en MySQL
23def crud_mysql():
24 with app.app_context():
25 db.create_all() # Crea la tabla en MySQL si no existe
26
27 # --- CREATE ---
28 nuevo = Producto(nombre='Laptop Pro 15', precio=1200.00, stock=10)
29 db.session.add(nuevo)
30 db.session.commit()
31
32 # --- READ ---
33 productos = Producto.query.all()
34 item = Producto.query.filter_by(nombre='Laptop Pro 15').first()
35
36 # --- UPDATE ---
37 if item:
38 item.precio = 1150.00
39 db.session.commit()
40
41 # --- DELETE ---
42 if item:
43 db.session.delete(item)
44 db.session.commit()

2. CRUD en Flask con Supabase

Supabase es una alternativa Open Source a Firebase basada en PostgreSQL. Puedes conectar Flask a Supabase de dos formas: mediante **SQLAlchemy ORM (PostgreSQL)** o mediante la **Librería Oficial Supabase Python SDK**.

Opción A: Vía Flask-SQLAlchemy (PostgreSQL Connection String)

instalar_postgres.sh
BASH
1pip install flask-sqlalchemy psycopg2-binary
config_supabase_orm.py
PYTHON
1# URI de conexión directa a PostgreSQL de Supabase
2app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres.xxx:tu_password@aws-0-sa-east-1.pooler.supabase.com:6543/postgres'
3
4# El código del modelo y las consultas db.session en SQLAlchemy se mantienen idénticos.

Opción B: Vía Supabase Python SDK (Client Directo)

Si deseas interactuar con las APIs automáticas, Row Level Security (RLS) y autenticación de Supabase desde Flask:

instalar_supabase_sdk.sh
BASH
1pip install supabase
flask_supabase_sdk_crud.py
PYTHON
1import os
2from flask import Flask, jsonify, request
3from supabase import create_client, Client
4
5app = Flask(__name__)
6
7SUPABASE_URL = "https://tu-proyecto.supabase.co"
8SUPABASE_KEY = "tu-anon-key-o-service-role-key"
9
10supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
11
12
13# CRUD con el cliente de Supabase en Flask
14@app.route('/api/supabase/productos', methods=['GET'])
15def listar_productos_supabase():
16 # --- READ ---
17 response = supabase.table('productos').select('*').execute()
18 return jsonify(response.data)
19
20
21@app.route('/api/supabase/productos', methods=['POST'])
22def crear_producto_supabase():
23 data = request.get_json()
24 # --- CREATE ---
25 response = supabase.table('productos').insert({
26 'nombre': data['nombre'],
27 'precio': data['precio'],
28 'stock': data.get('stock', 0)
29 }).execute()
30 return jsonify(response.data), 201
31
32
33@app.route('/api/supabase/productos/<int:id>', methods=['PUT'])
34def actualizar_producto_supabase(id):
35 data = request.get_json()
36 # --- UPDATE ---
37 response = supabase.table('productos').update({
38 'precio': data['precio']
39 }).eq('id', id).execute()
40 return jsonify(response.data)
41
42
43@app.route('/api/supabase/productos/<int:id>', methods=['DELETE'])
44def eliminar_producto_supabase(id):
45 # --- DELETE ---
46 response = supabase.table('productos').delete().eq('id', id).execute()
47 return jsonify({'mensaje': 'Eliminado', 'data': response.data})

Ponte a prueba

Verifica si comprendes la integración de bases de datos con SQLAlchemy en Flask.

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.