0Pricing
Kotlin Academy · Aula

Definindo tabelas com a DSL Table

Defina esquemas de tabelas tipados com colunas, chaves primárias e chaves estrangeiras.

Definindo tabelas com a DSL Table é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

Objetos de tabela do Exposed

No Exposed, as tabelas do banco de dados são representadas como objetos singleton do Kotlin que estendem Table (DSL de consultas) ou IntIdTable/LongIdTable/UUIDTable (camada DAO). As definições de colunas são propriedades Kotlin.

Uma definição básica de tabela

Estenda Table e defina as colunas usando as funções integradas de criação de colunas:

import org.jetbrains.exposed.sql.Table

object Users : Table("users") {
    val id    = long("id").autoIncrement()
    val name  = varchar("name", 100)
    val email = varchar("email", 255).uniqueIndex()
    val age   = integer("age").nullable()

    override val primaryKey = PrimaryKey(id)
}

Tipos de coluna

O Exposed fornece funções de criação para tipos SQL comuns:

  • integer("col"), long("col"), short("col")
  • varchar("col", length), text("col")
  • bool("col"), double("col"), decimal("col", precision, scale)
  • datetime("col"), date("col"), timestamp("col")
  • blob("col"), uuid("col"), binary("col", length)

Colunas anuláveis

Chame .nullable() em qualquer coluna para permitir valores NULL. O tipo Kotlin se torna anulável (String? em vez de String):

object Products : Table("products") {
    val id          = long("id").autoIncrement()
    val name        = varchar("name", 200)
    val description = text("description").nullable()
    override val primaryKey = PrimaryKey(id)
}

Valores padrão

Use .default(value) para um valor padrão definido no Kotlin (aplicado antes da inserção) ou .defaultExpression(expr) para um valor padrão SQL definido no banco de dados:

object Orders : Table("orders") {
    val id        = long("id").autoIncrement()
    val status    = varchar("status", 20).default("PENDING")
    val createdAt = datetime("created_at")
        .defaultExpression(CurrentDateTime)
    override val primaryKey = PrimaryKey(id)
}

Índices e restrições de unicidade

Chame .index() para um índice comum ou .uniqueIndex() para um índice exclusivo diretamente em uma coluna. Para índices compostos, use a função index() na tabela:

object Articles : Table("articles") {
    val id    = long("id").autoIncrement()
    val title = varchar("title", 300).index()
    val slug  = varchar("slug", 300).uniqueIndex()
    override val primaryKey = PrimaryKey(id)
}

Chaves estrangeiras

Use .references() para declarar uma restrição de chave estrangeira entre colunas. Passe a coluna referenciada e, opcionalmente, as ações onDelete e onUpdate:

object Posts : Table("posts") {
    val id       = long("id").autoIncrement()
    val authorId = long("author_id").references(Users.id, onDelete = ReferenceOption.CASCADE)
    val title    = varchar("title", 300)
    override val primaryKey = PrimaryKey(id)
}

Variantes de IdTable

Na camada DAO, use tabelas de ID tipadas em vez de uma Table simples:

  • IntIdTable("name") — chave primária de incremento automático do tipo Int chamada id
  • LongIdTable("name") — chave primária de incremento automático do tipo Long
  • UUIDTable("name") — chave primária UUID
object Users : LongIdTable("users") {
    val name  = varchar("name", 100)
    val email = varchar("email", 255).uniqueIndex()
}

Chaves primárias compostas

Defina uma chave primária composta passando várias colunas para PrimaryKey():

object UserRoles : Table("user_roles") {
    val userId = long("user_id").references(Users.id)
    val roleId = long("role_id").references(Roles.id)
    override val primaryKey = PrimaryKey(userId, roleId)
}

Colunas de enumeração

Armazene valores de enumeração do Kotlin como cadeias de caracteres ou ordinais usando enumerationByName() ou enumeration():

enum class Status { ACTIVE, INACTIVE, BANNED }

object Users : LongIdTable("users") {
    val name   = varchar("name", 100)
    val status = enumerationByName<Status>("status", 20)
}

Aplicando alterações ao esquema

Chame SchemaUtils.createMissingTablesAndColumns() para adicionar tabelas e colunas ausentes sem remover os dados existentes — uma migração segura para desenvolvimento. Em produção, use uma ferramenta de migração como Flyway ou Liquibase.

transaction {
    SchemaUtils.createMissingTablesAndColumns(Users, Posts, Orders)
}

Verificação rápida

Como declarar uma chave estrangeira de Posts.authorId para Users.id na DSL de tabelas do Exposed?

Recapitulação: definindo tabelas com a DSL de tabelas

Principais pontos:

  • As tabelas são objetos object que estendem Table, LongIdTable etc.
  • Colunas: varchar, integer, long, bool, datetime, uuid etc.
  • .nullable(), .default(), .uniqueIndex() e .references() modificam as colunas
  • Chaves primárias compostas: PrimaryKey(col1, col2)
  • Aplique o esquema com SchemaUtils.create() ou createMissingTablesAndColumns()

Perguntas Frequentes

A aula “Definindo tabelas com a DSL Table” é grátis?

Sim — o texto completo de “Definindo tabelas com a DSL Table” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “Definindo tabelas com a DSL Table”?

Defina esquemas de tabelas tipados com colunas, chaves primárias e chaves estrangeiras. Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Definindo tabelas com a DSL Table”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Configuração do Exposed: conexão com banco de dados e DSL de transações
  2. Definindo tabelas com a DSL Table
  3. CRUD com a DSL de consultas: insert, select, update, delete
  4. DAO do Exposed: classes de entidades e relacionamentos
← Voltar para Kotlin Academy