Capa de Abstracción de la Base de Datos (DAL) de web2pyTM

Ejemplos

define_table, insert, count, delete, update

1.
2.
3.
4.
5.
6.
7.
8.
9.
db = DAL('postgres://user:password@hostname/db', pool_size=10)
db.define_table('persona',Field('nombre','string'))
id= db.persona.insert(name='max')
consulta=(db.persona.id==id)
db(consulta).count()
db(consulta).delete()
db(consulta).update(nombre='Max')
filas = db(consulta).select(orderby=db.persona.nombre)
for fila in filas: print fila.nombre

Ejemplos de cadenas uri strings para DAL

Tipos de campos válidos

Atributos de campo válidos

Cambiar la lista de campos o los tipos de campos en un modelo, dispara una migración automática, por ej. web2py genera el SQL para alterar la tabla en concordancia. Si la tabla no existe es creada. Las acciones de migración son registradas en el archivo sql.log accesible vía la interfaz administrativa. Las Migraciones pueden sehabilitarse por tabla pasando migrate=False a define_table.

Seleccionar atributos

1.
filas = db(consulta).select(*campos, orderby=..., left=..., groupby=..., having=..., limitby=..., cache=...)

Atajos

1.
2.
3.
4.
5.
6.
7.
db['persona']                     ### db.persona
db.persona['nombre'] ### db.persona.nombre
db['persona']['nombre'] ### db.persona.nombre
db.persona[0]=dict(nombre='Max') ### insert
db.persona[id]=dict(nombre='Max') ### update by db.person.id
print db.persona[id] ### select by db.person.id
del db.persona[id] ### delete by db.person.id

Truncar y bajar (eliminar) una tabla

1.
2.
db.persona.truncate()
db.persona.drop()

Juntas por campos referenciados (Inner joins)

1.
2.
3.
4.
5.
6.
db.define_table('perro',Field('nombre'))
db.define_table('amistad', Field('persona',db.person), Field('perro',db.perro))
db.amistad.insert(persona=id, perro=db.perro.insert(nombre=’Snoopy’))
amigos=(db.persona.id==db.amistad.persona)&(db.perro.id==db.amistad.perro)
filas = db(amigos).select(db.persona.nombre, db.perro.nombre)
for fila in filas: print fila.persona.nombre, 'es amigo de', fila.perro.nombre

Juntas externas izquierdas (Left Outer Joins)

1.
2.
3.
4.
consulta=(db.persona.id>0)
amigos=(db.persona.id==db.amistad.persona)&(db.perro.id==db.amistad.perro)
filas = db(consulta).select(db.persona.nombre, db.perro.nombre, left=db.perro.on(amigos))
for fila in filas: print fila.persona.nombre, 'es amigo de', fila.perro.nombre or 'nadie'

Consultas complejas

1.
2.
3.
4.
5.
6.
consulta = (db.persona.id==1)|((db.persona.id==2)&(db.persona.nombre=='Max'))
consulta = (db.persona.id==db.amistad.persona)&(db.perro.id==db.amistad.perro)
consulta = db.persona.nombre.lower().like(‘m%) # SQL LIKE
consulta = db.persona.id.belongs(('max','Max','MAX')) # SQL IN
consulta = db.persona.nacimiento.year()+1==2008
filas = db(consulta).select()

Selecciones anidadas (subselect)

1.
consulta = db.persona.id.belongs(db()._select(db.amistad.persona)

Agregados

1.
fila=db(amigos).select(db.persona.nombre,db.perro.id.count(),groupby=db.perro.id)
Funciones de agregado: db.table.field.count(), .max(), .min(), sum().

Alias

1.
2.
3.
4.
5.
persona=db.persona
amistad=db.amistad
mascota=db.perro.with_alias('mascota')
consulta=(mascota.id==amistad.perro)&(amistad.persona==persona.id)
filas=db().select(persona.nombre,mascota.nombre,left=mascota.on(consulta))

Caching

1.
rows=db().select(db.person.ALL,cache=(cache.ram,3600))
cache=(model,cache_timeout) donde model puede ser cache.ram, cache.disk, cache.memcache o un modelo de cache de usuario, cache_timeout es en segundos.

Entrada CSV

1.
db.persona.import_from_csv_file(open(nombredearchivo,'rb'))

Salida CSV

1.
strfilas)

Salida HTML

1.
print filas.xml()

Validadores de campos de conjuntos

1.
2.
db.persona.nombre.requires=IS_NOT_IN_DB(db,db.persona.nombre) # requiere que el nombre no este previamente en la base de datos
db.amistad.persona.requires=IS_IN_DB(db,db.persona.id,%(nombre)s’)

Crea y procesa un formulario desde un modelo

1.
2.
3.
form = SQLFORM(db.amistad)
if form.accepts(request.vars, session): response.flash='registro insertado'
elif form.errors: response.flash='error en el formulario'
Este formulario puede ser mostrado en una vista como:
1.
{{=form}}