Pular para o conteúdo
Skillpedia
Código em geral280 mil · #69

kotlin-exposed-patterns

Ajuda seu agente a trabalhar com o ORM Exposed em Kotlin. Facilita a criação de consultas, o gerenciamento de transações e a integração com bancos de dados.

O que ela faz

Esta ferramenta ajuda a organizar e gerenciar o acesso a bancos de dados em seus projetos de programação usando uma biblioteca chamada Exposed. Ela oferece maneiras eficientes de consultar, adicionar, atualizar e excluir dados, além de configurar a conexão com o banco de dados e gerenciar as mudanças na estrutura dele.

Quando usar

  • ✓Ao iniciar um novo projeto que precisa armazenar informações.
  • ✓Quando você precisa buscar ou modificar dados em um banco de dados.
  • ✓Ao configurar como seu programa se conecta ao banco de dados.

Exemplo do que pedir para a IA

“Como configuro a conexão com o banco de dados e as migrações para um projeto Kotlin Exposed?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/kotlin-exposed-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/kotlin-exposed-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ela funciona definindo como os dados são estruturados e como as consultas são feitas. Para garantir que o banco de dados esteja sempre atualizado, ela usa ferramentas para aplicar mudanças automaticamente. As conexões com o banco de dados são gerenciadas de forma eficiente para melhor desempenho.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill kotlin-exposed-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/kotlin-exposed-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões do Kotlin Exposed

Padrões abrangentes para acesso a banco de dados com o ORM JetBrains Exposed, incluindo consultas DSL, DAO, transações e configuração pronta para produção.

Quando Usar

  • Configurando acesso a banco de dados com Exposed
  • Escrevendo consultas SQL usando Exposed DSL ou DAO
  • Configurando pooling de conexões com HikariCP
  • Criando migrações de banco de dados com Flyway
  • Implementando o padrão de repositório com Exposed
  • Lidando com colunas JSON e consultas complexas

Como Funciona

O Exposed oferece dois estilos de consulta: DSL para expressões diretas semelhantes a SQL e DAO para gerenciamento do ciclo de vida de entidades. O HikariCP gerencia um pool de conexões de banco de dados reutilizáveis configuradas via HikariConfig. O Flyway executa scripts de migração SQL versionados na inicialização para manter o esquema sincronizado. Todas as operações de banco de dados são executadas dentro de blocos newSuspendedTransaction para segurança de corrotina e atomicidade. O padrão de repositório encapsula as consultas do Exposed atrás de uma interface para que a lógica de negócios permaneça desacoplada da camada de dados e os testes possam usar um banco de dados H2 em memória.

Exemplos

Consulta DSL

suspend fun findUserById(id: UUID): UserRow? =
    newSuspendedTransaction {
        UsersTable.selectAll()
            .where { UsersTable.id eq id }
            .map { it.toUser() }
            .singleOrNull()
    }

Uso de Entidade DAO

suspend fun createUser(request: CreateUserRequest): User =
    newSuspendedTransaction {
        UserEntity.new {
            name = request.name
            email = request.email
            role = request.role
        }.toModel()
    }

Configuração do HikariCP

val hikariConfig = HikariConfig().apply {
    driverClassName = config.driver
    jdbcUrl = config.url
    username = config.username
    password = config.password
    maximumPoolSize = config.maxPoolSize
    isAutoCommit = false
    transactionIsolation = "TRANSACTION_READ_COMMITTED"
    validate()
}

Configuração do Banco de Dados

Pooling de Conexões HikariCP

// DatabaseFactory.kt
object DatabaseFactory {
    fun create(config: DatabaseConfig): Database {
        val hikariConfig = HikariConfig().apply {
            driverClassName = config.driver
            jdbcUrl = config.url
            username = config.username
            password = config.password
            maximumPoolSize = config.maxPoolSize
            isAutoCommit = false
            transactionIsolation = "TRANSACTION_READ_COMMITTED"
            validate()
        }

        return Database.connect(HikariDataSource(hikariConfig))
    }
}

data class DatabaseConfig(
    val url: String,
    val driver: String = "org.postgresql.Driver",
    val username: String = "",
    val password: String = "",
    val maxPoolSize: Int = 10,
)

Migrações Flyway

// FlywayMigration.kt
fun runMigrations(config: DatabaseConfig) {
    Flyway.configure()
        .dataSource(config.url, config.username, config.password)
        .locations("classpath:db/migration")
        .baselineOnMigrate(true)
        .load()
        .migrate()
}

// Application startup
fun Application.module() {
    val config = DatabaseConfig(
        url = environment.config.property("database.url").getString(),
        username = environment.config.property("database.username").getString(),
        password = environment.config.property("database.password").getString(),
    )
    runMigrations(config)
    val database = DatabaseFactory.create(config)
    // ...
}

Arquivos de Migração

-- src/main/resources/db/migration/V1__create_users.sql
CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    role VARCHAR(20) NOT NULL DEFAULT 'USER',
    metadata JSONB,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_role ON users(role);

Definições de Tabela

Tabelas no Estilo DSL

// tables/UsersTable.kt
object UsersTable : UUIDTable("users") {
    val name = varchar("name", 100)
    val email = varchar("email", 255).uniqueIndex()
    val role = enumerationByName<Role>("role", 20)
    val metadata = jsonb<UserMetadata>("metadata", Json.Default).nullable()
    val createdAt = timestampWithTimeZone("created_at").defaultExpression(CurrentTimestampWithTimeZone)
    val updatedAt = timestampWithTimeZone("updated_at").defaultExpression(CurrentTimestampWithTimeZone)
}


…
Perguntas frequentes

O que é um ORM?

ORM significa 'Object-Relational Mapping'. É uma técnica que permite que você escreva código em uma linguagem de programação (como Kotlin) para interagir com um banco de dados, em vez de escrever comandos SQL diretamente.

O que são 'migrations'?

Migrations são como versões do seu banco de dados. Elas permitem que você aplique mudanças na estrutura do banco de dados (como adicionar tabelas ou colunas) de forma controlada e repetível.

Por que usar 'connection pooling'?

Connection pooling é uma técnica que reutiliza conexões de banco de dados. Em vez de abrir e fechar uma nova conexão a cada vez que o programa precisa acessar o banco de dados, ele mantém um conjunto de conexões prontas para uso, o que torna o acesso mais rápido.

Detalhes

Descrição original do autor

JetBrains Exposed ORM patterns including DSL queries, DAO pattern, transactions, HikariCP connection pooling, Flyway migrations, and repository pattern. Use when working with the Exposed ORM — DSL or DAO queries, transactions, pooling, or migrations.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#69
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas