Migracje
System migracji Vista
Dział zatytułowany „System migracji Vista”Mechanizm działania
Dział zatytułowany „Mechanizm działania”const SCHEMA_VERSION: i64 = 20250201; // YYYYMMDD format
pub async fn run_migrations(pool: &SqlitePool) -> Result<()> { let current_version: i64 = sqlx::query_scalar("PRAGMA user_version;") .fetch_one(pool).await?;
if current_version >= SCHEMA_VERSION { return Ok(()); // Already up to date }
// UWAGA: System usuwa WSZYSTKIE tabele i tworzy od nowa! drop_existing_objects(conn).await?;
for statement in SCHEMA_STATEMENTS { sqlx::query(statement.sql).execute(&mut *tx).await?; }
sqlx::query(&format!("PRAGMA user_version = {SCHEMA_VERSION};")) .execute(&mut *tx).await?;}Konsekwencje
Dział zatytułowany „Konsekwencje”| Aspekt | Stan |
|---|---|
| Development | ✅ Działa - czysta baza przy każdej zmianie |
| Fresh install | ✅ Działa - tworzy schemat od zera |
| Upgrade z danymi | ❌ TRACI WSZYSTKIE DANE |
| Migracja produkcyjna | ❌ Nie obsługiwana |
Proces zmiany schematu
Dział zatytułowany „Proces zmiany schematu”1. Edytuj schemat
Dział zatytułowany „1. Edytuj schemat”# Główny plik schematusrc-tauri/src/database/schema.rs// Dodaj nową kolumnę lub tabelę do SCHEMA_STATEMENTSpub const SCHEMA_STATEMENTS: &[SchemaStatement] = &[ SchemaStatement { sql: r#" CREATE TABLE users ( user_id TEXT PRIMARY KEY, name TEXT NOT NULL, // ... nowe pola tutaj ) "#, }, // ... pozostałe tabele];2. Zwiększ wersję
Dział zatytułowany „2. Zwiększ wersję”const SCHEMA_VERSION: i64 = 20251204; // Nowa data3. Zaktualizuj modele
Dział zatytułowany „3. Zaktualizuj modele”#[derive(Debug, Clone, Serialize, Deserialize, sqlx::FromRow)]pub struct User { pub user_id: String, pub name: String, pub new_field: Option<String>, // Nowe pole}export interface User { user_id: string; name: string; new_field?: string; // Nowe pole}4. Przetestuj
Dział zatytułowany „4. Przetestuj”# Reset bazy (development)pnpm db:reset
# Uruchom aplikacjępnpm tauri:devBackup & Recovery
Dział zatytułowany „Backup & Recovery”Lokalizacje bazy danych
Dział zatytułowany „Lokalizacje bazy danych”# macOS~/Library/Application Support/Vista/vista.db~/Library/Application Support/Vista/vista.db-wal~/Library/Application Support/Vista/vista.db-shm
# Windows%APPDATA%/Vista/vista.db
# Linux~/.local/share/Vista/vista.dbRęczny backup
Dział zatytułowany „Ręczny backup”# Bezpieczny backup (nawet gdy aplikacja działa)sqlite3 "$HOME/Library/Application Support/Vista/vista.db" \ ".backup '$HOME/Vista-Backups/vista_$(date +%Y%m%d_%H%M%S).db'"Disaster recovery
Dział zatytułowany „Disaster recovery”# 1. Zatrzymaj aplikację Vista
# 2. Backup uszkodzonej bazymv ~/Library/Application\ Support/Vista/vista.db ~/vista_corrupted_backup.db
# 3. Przywróć z backupucp ~/Vista-Backups/vista_20251127_120000.db \ ~/Library/Application\ Support/Vista/vista.db
# 4. Uruchom Vista - migracje wykonają się automatycznie
# 5. Zweryfikuj integralnośćsqlite3 ~/Library/Application\ Support/Vista/vista.db "PRAGMA integrity_check;"Recovery bez backupu
Dział zatytułowany „Recovery bez backupu”# SQLite recovery modesqlite3 corrupted.db ".recover" | sqlite3 recovered.db
# Lub sqlite3_recoversqlite3_recover corrupted.db recovered.dbRetencja danych
Dział zatytułowany „Retencja danych”| Typ danych | Retencja | Konfiguracja |
|---|---|---|
| Audio recordings | 7-365 dni | user.audio_retention_days |
| Visit drafts | Bez limitu | Ręczne usuwanie |
| Audit logs | 3 lata | Wymagane prawnie |
| Session tokens | 24h - 30 dni | token_type dependent |
| Password reset tokens | 1 godzina | Auto-expire |
Przyszłe ulepszenia
Dział zatytułowany „Przyszłe ulepszenia”Planowane zmiany
Dział zatytułowany „Planowane zmiany”- Incremental migrations - prawdziwy system migracji z wersjonowaniem
- Data preservation - ALTER TABLE zamiast DROP/CREATE
- Rollback support - możliwość cofnięcia migracji
- Migration testing - automatyczne testy migracji
Przykład docelowego systemu
Dział zatytułowany „Przykład docelowego systemu”// Przyszła architektura (planowana)pub enum Migration { V20251201_AddUserPreferences, V20251202_AddAudioRetention, V20251203_AddTasksPanel,}
impl Migration { pub fn up(&self, conn: &Connection) -> Result<()> { match self { Self::V20251201_AddUserPreferences => { // ALTER TABLE users ADD COLUMN ... } // ... } }
pub fn down(&self, conn: &Connection) -> Result<()> { // Rollback logic }}