Curso web2py

Interagindo com o Select

O select, como visto no capítulo sobre a DAL, é a operação para selecionar registros do banco de dados. Devido à complexidade das seleções que queremos fazer dentro de um banco de dados às vezes, precisamos de elementos especiais para nos auxiliar. Dessa forma, o select pode ser acompanhado de diferentes opções. Confira a seguir.

Selecionando campos

Quando fazemos um select simplesmente chamando o método select, selecionamos todos os campos dos registros. Portanto, se temos uma tabela gatos com os campos nome e raca, ao fazer:

gatos = db(db.gatos.id>0).select()

Teremos selecionado todos os gatos e todos os campos. Porém, podemos selecionar apenas os que desejarmos informando os campos. Por exemplo:

gatos = db(db.gatos.id>0).select(db.gatos.nome)

Irá retornar na seleção, para cada registro, apenas o campo nome.

Selects recursivos

Algumas vezes precisamos criar campos que referenciam outra tabela, isto é, uma foreign key. No web2py isso é feito facilmente apenas informando, como tipo de campo, a tabela que aquele campo deve referenciar no tipo reference.

db.define_table('brinquedos',
    Field('nome'),
    Field('gato', 'reference gatos')
    )

Dessa forma, criamos uma tabela de brinquedos a qual recebe o nome do brinquedo e o id do gato ao qual o brinquedo pertence.

Quando fizermos um select nessa tabela, podemos selecionar recursivamente informações do gato que foi referenciado no registro. Portanto, podemos ver informações do gato a partir de um select no brinquedo:

brinquedos = db(db.brinquedos.nome == 'sininho').select()
for brinquedo in brinquedos:
    print "O brinquedo %s pertence ao %s" % (brinquedo.nome, brinquedo.gato.nome)

orderby, limitby e outros argumentos

O método select pode receber diversos argumentos que modificarão a forma como os registros serão selecionados ou exibidos.


orderby

O orderby é um argumento que declara como deve ser a organização dos registros selecionados. Por exemplo, quero selecionar meus gatos em ordem alfabética de nome:

gatos = db(db.gatos.id>0).select(orderby=db.gatos.nome)

Agora eu quero colocar na ordem inversa:

gatos = db(db.gatos.id>0).select(orderby=~db.gatos.nome)

A diferença é apenas o símbolo ~. Além disso, posso querer uma coisa em uma ordem completamente aleatória:

gatos = db(db.gatos.id>0).select(orderby='<random>')


limitby

O limitby informa ao select de qual registro até qual outro ele deve selecionar, isto é, seleciona apenas uma parte definida.

gatos = db(db.gatos.raca == 'Persa').select(limitby=(0,5))

Ele informa valores (início,fim) para limitar o select, ou seja, vai começar a selecionar no registro de índice início e terminar no registro anterior ao índice fim.


O método select possui diversos argumentos que podem ser melhor explorados na documentação do web2py.

Aplicações nos controllers

O select é a operação mais utilizada nos controllers, realizada sempre para recuperar informações do banco de dados para múltiplas finalidades. Observe o exemplo abaixo.

Paginação de 10 registros por vez

def gatinhos():
    if not request.vars.pagina:
        redirect(URL(vars={'pagina':1}))
    else:
        pagina = int(request.vars.pagina)
    inicio = (pagina-1)*10
    fim = pagina*10
    gatos = db(db.gatos).select(limitby=(inicio,fim))
    return dict(gatos=gatos)

Receberemos na URL uma variável pagina, que nos informará em qual página estamos. Essa variável ajudará a calcular de qual registro até qual outro queremos selecionar, reduzindo um no início pois os índices começam em 0. Dessa forma, vamos mudando de página sempre de 10 em 10 registros.