On Thursday, April 17, 2025 at 10:44:35 am +02:00, Ole Aamot ole@aamot.software wrote:
On Tuesday, April 15, 2025 at 7:58:16 am +02:00, Petter Reinholdtsen pere@hungry.com wrote:
[Ole Aamot]
Var det dette du tenkte på med tanke på databasemigrering?
Nei. Jeg snakker om at Nikita skal oppdatere databasen ved oppstart, hvis den ikke har forventet datastruktur. Aha, da skjønner jeg! Du tenker på en form for automatisk migrering ved oppstart av applikasjonen – altså at hvis databasen mangler tabeller eller felter, så skal Nikita (programmet) selv kunne opprette eller oppdatere strukturen uten manuell inngripen.
En slik løsning innebærer ofte at man ved oppstart sjekker:
Om databasen finnes.
Om nødvendige tabeller eksisterer.
Om felter og indekser er på plass.
Og eventuelt kjører migreringsskript for å oppdatere databasen til siste "versjon". Eksempel på hvordan man kan gjøre dette i Python med SQLite:
Og hvis du vil at Nikita skal sjekke og oppdatere databasen ved oppstart, finnes det et par etablerte måter å gjøre dette på i Java-verdenen. Den vanligste og tryggeste løsningen er å bruke et migreringsverktøy som: ✅ Flyway eller Liquibase Disse verktøyene lar deg versjonere og kjøre databasemigreringer automatisk ved oppstart – typisk via main() eller Spring Boot-lifecycle.
👇 Eksempel med Flyway (mest brukt)
- Legg til Flyway-avhengighet (Maven):
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>10.0.0</version> </dependency> 2. Lag en migrasjonsfil i resources/db/migration/: F.eks. V1__create_users_table.sql
CREATE TABLE IF NOT EXISTS users ( id INT PRIMARY KEY, username VARCHAR(255) NOT NULL, email VARCHAR(255) );
- I Java-koden:
import org.flywaydb.core.Flyway;
public class Main { public static void main(String[] args) { Flyway flyway = Flyway.configure() .dataSource("jdbc:sqlite:nikita.db", null, null) .load();
// Migrer databasen ved oppstart flyway.migrate();
// Start appen etterpå System.out.println("Database oppdatert. Starter Nikita..."); } }
Alternativ: Manuell sjekk ved oppstart Hvis du ikke vil bruke et eksternt bibliotek, kan du gjøre noe sånt:
Connection conn = DriverManager.getConnection("jdbc:sqlite:nikita.db"); DatabaseMetaData meta = conn.getMetaData(); ResultSet tables = meta.getTables(null, null, "users", null);
if (!tables.next()) { // Tabell finnes ikke – opprett Statement stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE users (id INTEGER PRIMARY KEY, username TEXT, email TEXT)"); }
Men dette kan bli vanskelig å vedlikeholde i lengden hvis du har mange tabeller og endringer.
📌 Anbefaling: Bruk Flyway. Det er lett, ryddig og lar deg kontrollere endringer med versjonering.
Vil du at jeg setter opp en ferdig Flyway-basert migreringsstruktur for deg? Vi kan skreddersy den til enten SQLite, PostgreSQL eller MySQL, alt etter hva du bruker. Her kommer en strukturert og fungerende mal for Flyway-baserte migreringsoppsett både for SQLite og PostgreSQL, med én katalogstruktur og to ulike main()-metoder for å kunne bruke begge miljøene hver for seg.
📁 Prosjektstruktur nikita-flyway/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/nikita/db/ │ │ ├── SQLiteMigrator.java │ │ └── PostgresMigrator.java │ └── resources/ │ ├── db/ │ │ ├── migration_sqlite/ │ │ │ └── V1__create_users_table.sql │ │ └── migration_postgres/ │ │ └── V1__create_users_table.sql ├── pom.xml
🧪 Eksempel-Migreringsfil resources/db/migration_sqlite/V1__create_users_table.sql CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, username TEXT NOT NULL, email TEXT );
resources/db/migration_postgres/V1__create_users_table.sql
CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, username VARCHAR(255) NOT NULL, email VARCHAR(255) );
🧠 SQLiteMigrator.java
package nikita.db;
import org.flywaydb.core.Flyway;
public class SQLiteMigrator { public static void main(String[] args) { Flyway flyway = Flyway.configure() .dataSource("jdbc:sqlite:nikita.db", null, null) .locations("classpath:db/migration_sqlite") .load();
flyway.migrate();
System.out.println("SQLite-databasen er oppdatert!"); } }
🧠 PostgresMigrator.java
package com.nikita.db;
import org.flywaydb.core.Flyway;
public class PostgresMigrator { public static void main(String[] args) { Flyway flyway = Flyway.configure() .dataSource( "jdbc:postgresql://localhost:5432/nikita", "postgres", "passord123" // sett passord her ) .locations("classpath:db/migration_postgres") .load();
flyway.migrate();
System.out.println("PostgreSQL-databasen er oppdatert!"); } }
🧱 pom.xml (med Flyway + JDBC for SQLite og PostgreSQL)
<project xmlns="http://maven.apache.org/POM/4.0.0" ...> <modelVersion>4.0.0</modelVersion> <groupId>com.nikita</groupId> <artifactId>nikita-flyway</artifactId> <version>1.0-SNAPSHOT</version>
<dependencies> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>10.0.0</version> </dependency>
<!-- SQLite JDBC --> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.45.1.0</version> </dependency>
<!-- PostgreSQL JDBC --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.7.1</version> </dependency> </dependencies> </project>
✅ Kjøring For å migrere SQLite:
mvn compile exec:java -Dexec.mainClass="com.nikita.db.SQLiteMigrator"
For å migrere PostgreSQL:
mvn compile exec:java -Dexec.mainClass="com.nikita.db.PostgresMigrator"
Her er .zip-filen med Flyway-migreringsprosjektet for både SQLite og PostgreSQL:
👉 📦 Innhold
* Full Maven-prosjektstruktur
* Ferdige migrator-klasser for begge databaser
* Egne migreringsskript for SQLite og PostgreSQL ▶️ Slik kjører du det
1. Pakk ut zip-filen.1
2. Naviger inn i mappen:
3. Kjør SQLite-migrering: 4. mvn compile exec:java -Dexec.mainClass="com.nikita.db.SQLiteMigrator"
5. Kjør PostgreSQL-migrering:
6. mvn compile exec:java -Dexec.mainClass="com.nikita.db.SQLiteMigrator" Gi beskjed hvis du vil legge til flere migrasjoner eller automatisk oppstart, Petter!
Mvh, Ole Aamot