Slick: Usando nome completo de schema.tabela com MySQL/PGSQL

Talvez o leitor já tenha se deparado com o problema de especificar o nome completo da tabela, formato schema.tabela, nas definições de Table’s do Slick.

Muitos tentam a seguinte solução, e encontram problemas:
object Pessoas extends Table[(Int,String)]("cadastro.pessoas") { // etc...

Solução: usar a versão de dois parâmetros de Table[T].apply, assim:
object Pessoas extends Table[(Int,String)](Some("cadastro"), "pessoas") {

Passar o nome completo como nome da tabela não funcionará. Irá gerar uma Exceção em tempo de execução afirmando não encontrar a tabela “cadastro.cadastro.pessoas”. Note o nome de catálogo/schema repetido.

O que aconteceu?

A origem do problema está em versões legadas do Slick, onde o código montava o nome de tabelas de acordo com os parâmetros de conexão + o nome especificado no Object que estende Table.

Para não quebrar o código legado, o desenvolvedor szeiger decidiu sobrecarregar o método apply de Table com um outro construtor, que recebe uma Option[String] como primeiro parâmetro. Quando criamos a tabela com um parâmetro, essa option recebe None. Quando passamos um primeiro parâmetro contendo o nome do schema/catálogo, o Slick passa adiante essa String e realiza as consultas com sucesso.

Resultando em:
object Pessoas extends Table[(Int,String)](Some("cadastro"), "pessoas") {

Que funciona perfeitamente. A mesma técnica funciona para Posgresql

Aprendendo uma nova linguagem

Aprender uma nova linguagem de programação não é tarefa trivial. O domínio de uma linguagem como Java, Scala ou Perl exige processos de aprendizado muito semelhantes aos da aquisição de uma nova linguagem humana.

Primeiramente, pode-se perceber que para programar computadores o domínio da lingua inglesa é essencial, o que já configura o primeiro obstáculo para nós falantes do português. Primeiro devemos aprender um segundo sistema simbólico e idiomático humano, para só depois aprendermos a programar os computadores usando os símbolos aprendidos. Portanto, a programação é uma tarefa duplamente complicada para aqueles que tem o inglês como segundo idioma.
Continue reading

Por que o foreach não funciona nos templates Play Framework

Como todos sabem, a partir do Play Framework 2.0, o antigo sistema de template foi substituido por uma solução muito mais limpa e poderosa. Basicamente usa-se o caractere “mágico” @ para tudo. No entanto, para aqueles que vem de outros sistemas de templates, podem haver alguns contratempos.

Um dos erros mais comuns é o de implementar idiomas imperativos no sistema de template. O exemplo mais claro é o fato do foreach não funcionar. Vejamos por que.
Continue reading

Programação imperativa em Scala

Mencionamos anteriormente que Scala tem a meta de integrar grandes sistemas usando apenas uma linguagem: desde rápidos scripts de instalação e administração de tarefas simples, à lógica de negócios, passando por complexos serviços distribuídos. Em todos os nossos tutoriais até agora, os idiomas usados foram funcionais. Por exemplo, usamos o idioma fold no lugar de loops while e do while, e todas as nossas variáveis foram imutáveis.

Porém, Scala é uma linguagem multi-paradigma e permite que todos os algoritmos funcionais que vimos até o momento sejam implementados também em idiomas imperativos.
Continue reading

Criando scripts em Scala

Em nossa Introdução a Scala falamos da escalabilidade da linguagem: é uma plataforma que permite criar desde scripts rápidos até grandes sistemas multitarefas e distribuídos. A meta dos criadores de Scala é tornar possível a construção de grandes sistemas usando apenas uma linguagem, ao invés da tradicional combinação de scripts Python ou Perl para tarefas de manutenção e instalação, Java ou Scala para a lógica de negócios e triggers/rotinas no banco de dados. Com Scala, é possível centralizar todo o desenvolvimento na mesma linguagem.
Continue reading

Tuplas e listas básicas em Scala

Em diversas circunstâncias, criar classes inteiras para acomodar dados simples pode tornar o código desnecessariamente complicado. Talvez seja preciso armazenar apenas a matrícula de alunos e sua menção no semestre em uma lista. Podemos precisar trabalhar uma lista de nomes e emails, para a qual seria um exagero criar uma classe dedicada. Para agrupar dados simples, Scala oferece a funcionalidade de tuplas. Tuplas são estruturas de dados que permitem agrupar dados estruturados com sintaxe extremamente simples: parenteses delimitam uma tupla, e cada ítem listado entre parenteses tem um significado de acordo com a ordem em que aparece.
Continue reading

A expressão for em Scala

Na linguagem Scala, for não é apenas um loop imperativo como em C e Java. for tem duas sintaxes, uma das quais é, na verdade, uma expressão e como tal retorna um valor. O valor de retorno do loop for em Scala é Unit, ou seja, não é um valor usável. Já o valor da expressão for depende do campo retornado através da palavra-chave yield.
Continue reading