Database Callings (Core)¶
El Core provee dos formas de interactuar con la base de datos:
- ORM con SQLAlchemy (
db_orm.py). - MySQL crudo con PyMySQL + compatibilidad Flask (
mysql.py).
Esto permite elegir entre modelos declarativos ORM y queries SQL directos según la necesidad del módulo.
ORM (db_orm.py)¶
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() # Para modelos ORM
- Provee un session manager integrado a Flask.
- Úsalo cuando definas modelos en
infrastructure/models/. - Ejemplo de modelo:
from core.db.db_ORM import db class Customer(db.Model): __tablename__ = "customers" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), nullable=False)
MySQL Compat (mysql.py)¶
from flaskext.mysql import MySQL as BaseMySQL
from flask import g
import pymysql
class MySQLCompat(BaseMySQL):
def connect(self):
return pymysql.connect(
host=self.app.config.get("MYSQL_HOST"),
user=self.app.config.get("MYSQL_USER"),
password=self.app.config.get("MYSQL_PASSWORD"),
db=self.app.config.get("MYSQL_DB"),
port=self.app.config.get("MYSQL_PORT", 3306),
cursorclass=pymysql.cursors.DictCursor,
autocommit=False
)
@property
def connection(self):
if not hasattr(g, '_mysql_connection'):
g._mysql_connection = self.connect()
return g._mysql_connection
def teardown_request(self, exception):
conn = g.pop('_mysql_connection', None)
if conn is not None:
if exception is None:
conn.commit()
else:
conn.rollback()
conn.close()
mysql = MySQLCompat()
- Conexión raw (sin ORM).
- Útil para consultas complejas, rendimiento crítico o migraciones heredadas.
- Maneja una sola conexión por request, asegurando
commitorollbackautomático enteardown_request.
Uso recomendado¶
- ORM → Para la mayoría de los casos (CRUD, relaciones, consistencia).
- MySQLCompat → Para queries grandes, reportes o procedimientos almacenados.
Ambos están disponibles globalmente:
from core.db.db_ORM import db # ORM
from core.db.mysql import mysql # Raw
Diagrama de relación¶
flowchart LR
subgraph Core.DB
A[db_ORM.py<br/>SQLAlchemy ORM]
B[mysql.py<br/>MySQLCompat raw]
end
App[Flask App] --> A
App --> B
A -->|Modelos declarativos| Modules
B -->|Consultas raw| Modules
Ventajas del enfoque mixto¶
- Flexibilidad: se puede elegir el estilo adecuado según el caso.
- Compatibilidad: soporta tanto queries SQLAlchemy como queries directas.
- Seguridad: transacciones por request en MySQLCompat.
- Escalabilidad: ORM para lo común, SQL raw para lo específico.