Files
butterfliu/migrations/003_add_metadata_fields.go
lzw-723 3182b29932
All checks were successful
Go CI / test-and-build (push) Successful in 10s
整理model
2026-04-06 17:40:56 +08:00

216 lines
4.4 KiB
Go

package migrations
import (
"database/sql"
)
func init() {
RegisterMigration(
3,
"Add metadata fields and timestamps",
migrateAddMetadataUp,
migrateAddMetadataDown,
)
}
func migrateAddMetadataUp(tx *sql.Tx) error {
// Add timestamps to libraries
_, err := tx.Exec(`
ALTER TABLE libraries ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE libraries ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
`)
if err != nil {
return err
}
// Add metadata and timestamps to media_files
_, err = tx.Exec(`
ALTER TABLE media_files ADD COLUMN file_size INTEGER DEFAULT 0
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE media_files ADD COLUMN format TEXT DEFAULT ''
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE media_files ADD COLUMN bit_rate INTEGER DEFAULT 0
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE media_files ADD COLUMN sample_rate INTEGER DEFAULT 0
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE media_files ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE media_files ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
`)
if err != nil {
return err
}
// Add fields to albums
_, err = tx.Exec(`
ALTER TABLE albums ADD COLUMN cover TEXT DEFAULT ''
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE albums ADD COLUMN year INTEGER DEFAULT 0
`)
if err != nil {
return err
}
// Add fields to songs
_, err = tx.Exec(`
ALTER TABLE songs ADD COLUMN track_number INTEGER DEFAULT 0
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE songs ADD COLUMN disc_number INTEGER DEFAULT 0
`)
if err != nil {
return err
}
_, err = tx.Exec(`
ALTER TABLE songs ADD COLUMN genre TEXT DEFAULT ''
`)
if err != nil {
return err
}
return nil
}
func migrateAddMetadataDown(tx *sql.Tx) error {
// SQLite doesn't support DROP COLUMN in older versions, so we need to rebuild tables
// Rebuild libraries
_, err := tx.Exec(`
CREATE TABLE libraries_old (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
path TEXT NOT NULL
)
`)
if err != nil {
return err
}
_, err = tx.Exec(`INSERT INTO libraries_old SELECT id, name, path FROM libraries`)
if err != nil {
return err
}
_, err = tx.Exec("DROP TABLE libraries")
if err != nil {
return err
}
_, err = tx.Exec("ALTER TABLE libraries_old RENAME TO libraries")
if err != nil {
return err
}
// Rebuild media_files
_, err = tx.Exec(`
CREATE TABLE media_files_old (
id INTEGER PRIMARY KEY AUTOINCREMENT,
path TEXT NOT NULL,
library_id INTEGER NOT NULL,
FOREIGN KEY (library_id) REFERENCES libraries(id) ON DELETE CASCADE
)
`)
if err != nil {
return err
}
_, err = tx.Exec(`INSERT INTO media_files_old SELECT id, path, library_id FROM media_files`)
if err != nil {
return err
}
_, err = tx.Exec("DROP TABLE media_files")
if err != nil {
return err
}
_, err = tx.Exec("ALTER TABLE media_files_old RENAME TO media_files")
if err != nil {
return err
}
// Rebuild albums
_, err = tx.Exec(`
CREATE TABLE albums_old (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
artist_id INTEGER,
FOREIGN KEY (artist_id) REFERENCES artists(id),
UNIQUE(title, artist_id)
)
`)
if err != nil {
return err
}
_, err = tx.Exec(`INSERT INTO albums_old SELECT id, title, artist_id FROM albums`)
if err != nil {
return err
}
_, err = tx.Exec("DROP TABLE albums")
if err != nil {
return err
}
_, err = tx.Exec("ALTER TABLE albums_old RENAME TO albums")
if err != nil {
return err
}
// Rebuild songs
_, err = tx.Exec(`
CREATE TABLE songs_old (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
album_id INTEGER,
artist_id INTEGER,
duration INTEGER,
media_file_id INTEGER UNIQUE,
FOREIGN KEY (album_id) REFERENCES albums(id),
FOREIGN KEY (artist_id) REFERENCES artists(id),
FOREIGN KEY (media_file_id) REFERENCES media_files(id) ON DELETE CASCADE
)
`)
if err != nil {
return err
}
_, err = tx.Exec(`INSERT INTO songs_old SELECT id, title, album_id, artist_id, duration, media_file_id FROM songs`)
if err != nil {
return err
}
_, err = tx.Exec("DROP TABLE songs")
if err != nil {
return err
}
_, err = tx.Exec("ALTER TABLE songs_old RENAME TO songs")
if err != nil {
return err
}
return nil
}