Escriu per cercar…

Postgres

Introducció

Per a aquesta activitat tens aquest projecte d’ajuda: https://gitlab.com/xtec/kotlin/postgres/

Entorn de treball

Crea un projecte:

ps
> mkdir postgres
> cd postgres
> gradle init --package dev.xtec --project-name postgres --java-version 21 --type kotlin-application --dsl kotlin --test-framework kotlintest --no-split-project --no-incubating --overwrite

Modifica el fitxer app/build.gradle.kts:

kotlin
plugins {
    id("app.cash.sqldelight") version "2.0.2"
    // ...
}

dependencies {
    implementation("app.cash.sqldelight:jdbc-driver:2.0.2")
    implementation("com.zaxxer:HikariCP:6.2.1")
    implementation("io.github.cdimascio:dotenv-kotlin:6.5.0")
    implementation("org.postgresql:postgresql:42.5.0")
    implementation("org.slf4j:slf4j-reload4j:2.0.16")
    // ...
}

sqldelight {
    databases {
        create("Database") {
            packageName.set("dev.xtec.data")
            dialect("app.cash.sqldelight:sqlite-3-38-dialect:2.0.2")
        }
    }
}

Afegeix un fitxer log4j.properties al directori app/src/main/resources per configurar slf4j:

properties
# Opció del logger arrel
log4j.rootLogger=INFO, stdout
# Envia els missatges de log a stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Configura l’esquema

Crea el directori app/src/main/sqldelight/dev/xtec/data per posar-hi els fitxers .sq

Afegeix un fitxer Customer.sq:

sql
CREATE TABLE IF NOT EXISTS customer (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT
);

insert:
INSERT INTO customer(name) VALUES (?);

select:
SELECT * FROM customer;

Genera el codi d’accés a la base de dades:

ps
>  .\gradlew generateSqlInterface 

Crea el fitxer app/src/main/resources/.env per guardar les dades de configuració de la base de dades (aquest fitxer no ha d’estar versionat):

PG_JDBC_URL = jdbc:postgresql://localhost:5432/acme
PG_USERNAME = postgres
PG_PASSWORD = password

Modifica el fitxer app/src/main/kotlin/dev/xtec/App.kt:

kotlin
package dev.xtec

import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.driver.jdbc.asJdbcDriver
import com.zaxxer.hikari.HikariDataSource
import dev.xtec.data.Database
import io.github.cdimascio.dotenv.dotenv

fun main() {
   
    val dotenv = dotenv()

    val driver: SqlDriver = HikariDataSource().apply {
        jdbcUrl = dotenv["PG_JDBC_URL"]
        driverClassName = "org.postgresql.Driver"
        username = dotenv["PG_USERNAME"]
        password = dotenv["PG_PASSWORD"]
    }.asJdbcDriver()

    val database = Database(driver)
    Database.Schema.create(driver)

    database.customerQueries.insert("Laura")

    val customer = database.customerQueries.select().executeAsList().first()
    println(customer)

}

Base de dades

Arrenca una base de dades tal com s’explica a {% link “/data/postgres/” %}.

Crea una base de dades amb el nom acme.

Executa l’aplicació:

ps
> .\gradlew run                                                                           
...

Customer(id=1, name=Laura, email=null)

Neon

Crea una base de dades a {% link “/cloud/neon/” %}.

A continuació modifica el fitxer .venv amb les dades de connexió de neon.

Per exemple:

properties
PG_JDBC_URL = jdbc:postgresql://ep-ancient-recipe-a9qwtikr.gwc.azure.neon.tech/sales
PG_USERNAME = sales_owner
PG_PASSWORD = npg_pnZrJxz87UiC

Verifica que el codi funciona sense modificar ni una línia de codi.