nim-chat-sdk/chat_sdk/migration.nim
2025-07-11 10:54:15 +08:00

33 lines
1017 B
Nim

import os, sequtils, algorithm
import db_connector/db_sqlite
import chronicles
proc ensureMigrationTable(db: DbConn) =
db.exec(sql"""
CREATE TABLE IF NOT EXISTS schema_migrations (
filename TEXT PRIMARY KEY,
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
proc hasMigrationRun(db: DbConn, filename: string): bool =
for row in db.fastRows(sql"SELECT 1 FROM schema_migrations WHERE filename = ?", filename):
return true
return false
proc markMigrationRun(db: DbConn, filename: string) =
db.exec(sql"INSERT INTO schema_migrations (filename) VALUES (?)", filename)
proc runMigrations*(db: DbConn, dir = "migrations") =
info "Migration process starting up"
ensureMigrationTable(db)
let files = walkFiles(dir / "*.sql").toSeq().sorted()
for file in files:
if hasMigrationRun(db, file):
info "Migration already applied", file
else:
info "Applying migration", file
let sql = readFile(file)
db.exec(sql(sql))
markMigrationRun(db, file)