migration-sqlite-seguralisted
Install: claude install-skill roldaobatista/roldao-method
# migration-sqlite-segura
Migration em app Electron com dado offline do cliente.
## Por que e diferente de migration em servidor
- Servidor: rollback via point-in-time recovery.
- Electron: usuario tem 1 arquivo `.db`. Migration ruim = dado perdido.
## Pattern
```typescript
// main/db/migration-runner.ts
import fs from 'node:fs';
import path from 'node:path';
import { app } from 'electron';
const DB_PATH = path.join(app.getPath('userData'), 'app.db');
const BACKUP_DIR = path.join(app.getPath('userData'), 'backups');
export async function runMigration(name: string, sqlUp: string) {
// 1. Backup ANTES
fs.mkdirSync(BACKUP_DIR, { recursive: true });
const ts = new Date().toISOString().replace(/[:.]/g, '-');
const backupPath = path.join(BACKUP_DIR, `${ts}-pre-${name}.db`);
fs.copyFileSync(DB_PATH, backupPath);
// 2. Aplicar
try {
await db.exec('BEGIN TRANSACTION');
await db.exec(sqlUp);
await db.exec('INSERT INTO _migrations (name, applied_at) VALUES (?, ?)',
[name, new Date().toISOString()]);
await db.exec('COMMIT');
} catch (err) {
await db.exec('ROLLBACK');
// 3. Restore se a transacao falhou
fs.copyFileSync(backupPath, DB_PATH);
throw err;
}
}
```
## Tabela de migrations
```sql
CREATE TABLE IF NOT EXISTS _migrations (
name TEXT PRIMARY KEY,
applied_at TEXT NOT NULL
);
```
## Regras
- **ELECTRON-003** — Toda migration faz backup em `userData/backups/`.
- Backups antigos limpos automaticamente ap