Python - SQLAlchemy y sus sesiones
¡Hola! Esta vez veremos como usar SQLAlchemy y sus sesiones para conectarse con la DB MySQL.
Para esto dejaremos un gist que nos ayudará a entender de forma práctica:
#librerías necesarias para utilizar el sqlalchemy | |
from sqlalchemy import create_engine | |
from sqlalchemy.orm import scoped_session | |
from sqlalchemy.orm import sessionmaker | |
#variable engine global | |
ENGINE = None | |
#La función conexión, sirve para crear una conexión maestra a partir de engine(cadena de conexión) que recibe credenciales | |
def createConnectionDB(conf: dict): | |
#Este es el global engine, por el momento se usa para abastecer al ENGINE global que se usará al momento de obtener los modelos de la DB | |
global ENGINE | |
#Se crea el engine para poder crear la conexión maestra | |
engine = create_engine("mysql+pymysql://"+conf['user']+":"+conf['pass']+"@"+conf['host']+":"+conf['port']+"/"+conf['dbname'],pool_size=3000, max_overflow=-1) | |
#Con el engine creado se abastece el ENGINE global | |
ENGINE = engine | |
#Usando la función sessionmaker y como parámetro el engine se crea un session_factory | |
session_factory = sessionmaker(bind=engine) | |
#Usando el scoped_session y como parámetro el session_factory se crea la conexión maestra | |
#la conexión maestra se declara como capital porque se puede invocar como función y utilizar como tal | |
Session = scoped_session(session_factory) | |
return Session | |
#Diccionario de credenciales para la DB | |
#Este diccionario servirá para poder pasar las credenciales al engine de la función createConnectionDB | |
CONF_DATABASE = {"user":"", | |
"pass":"", | |
"host":"", | |
"port":"", | |
"dbname":"" | |
} | |
#creamos la conexión maestra a la DB utilizando como parámetro el diccionario de credenciales | |
Session = createConnectionDB(CONF_DATABASE) | |
#Con esta conexión maestra podemos utilizarla y crear más conexiones a partir de esta | |
Session.query() #se corrobora que podemos llamar el método query que es particular de las conexiones | |
#Verificamos el tipo de conexión | |
print(f"Sessión padre -> {Session}") #Imprimirá scoped | |
#Creamos una conexión hijo a partir de la conexión maestra | |
session_child = Session() | |
#Con esta conexión no se pueden crear más conexiones sería una violación | |
session_child.query() #se corrobora que podemos llamar el método query que es particular de las conexiones | |
print(f"Sessión hijo ->", {session_child}) #Imprimirá session |