SQLAlchemy. Funciones.


El ORM de SQLAlchemy traduce algunas funciones comunes en muchos RDBMS. Sólo tenemos que importar func y tendremos accesibles las funciones descritas en el manual. También hemos importado el tipo DateTime.

Siguiendo con los ejemplos anteriores, vamos a crear el modelo Employee con un nuevo campo llamado hired_on. Podéis encontrar los ejemplos originales en pythoncentral.

Como siempre, creamos los modelos y añadimos algunos datos. La única diferencia con las entradas anteriores es el campo hired_on que toma el valor now por defecto.

# -*- coding: utf-8 -*-

from sqlalchemy import Column, String, DateTime, Integer, ForeignKey, func
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Department(Base):
    __tablename__ = 'department'
    id = Column(Integer, primary_key=True)
    name = Column(String)


class Employee(Base):
    __tablename__ = 'employee'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    hired_on = Column(DateTime, default=func.now())
    department_id = Column(Integer, ForeignKey('department.id'))
    department = relationship(
        Department, backref=backref('employees', uselist=True))


from sqlalchemy import create_engine
engine = create_engine('sqlite:///')

from sqlalchemy.orm import sessionmaker
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)

s = session()
it_department = Department(name='IT')
pepe = Employee(name='Pepe', department=it_department)
s.add(pepe)
print "Pepe antes commit: {}".format(pepe.hired_on)
s.add(it_department)
s.commit()
print "Pepe despues del commit: {}".format(pepe.hired_on)

Pepe antes commit: None Pepe despues commit: 2017-03-15 11:00:56

Ello es porque aún no hemos commitado los cambios pendientes en la sesión. En realidad func.now() se traduce por now(). Vamos a comprobarlo:

print func.now()

now()

y por lo tanto, mientras no se postee en la DB no va ha obtener un valor.

Otras funciones útiles pueden ser: count(), coalesce(), char_length(), etc…