Saltar a contenido

Database Callings (Core)

El Core provee dos formas de interactuar con la base de datos:

  1. ORM con SQLAlchemy (db_orm.py).
  2. 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 commit o rollback automático en teardown_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.