diff options
| author | dev | 2026-06-24 04:40:22 +0200 |
|---|---|---|
| committer | dev | 2026-06-24 04:40:22 +0200 |
| commit | 1d20ca594c4246a3fcd63c52911b6d56c0aa503e (patch) | |
| tree | 0720522d745a455e344b4b4721651af06bc7497c /src/imdbdata.go | |
| parent | 6d5231a204790dae325a0557d908c2c6d15bb516 (diff) | |
| download | hnimdbbot-1d20ca594c4246a3fcd63c52911b6d56c0aa503e.tar.gz | |
feat: adapt genre code for n:m relation via imdb_genre
- genre table: (id, name) with unique name constraint
- imdb_genre table: (id, imdb_id, genre_id) junction table
- Upsert genres via INSERT ... ON DUPLICATE KEY UPDATE
- Link via imdb_genre using LAST_INSERT_ID
- Check missing genres via LEFT JOIN imdb_genre
Diffstat (limited to 'src/imdbdata.go')
| -rw-r--r-- | src/imdbdata.go | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/src/imdbdata.go b/src/imdbdata.go index c4216a7..cea914e 100644 --- a/src/imdbdata.go +++ b/src/imdbdata.go @@ -263,15 +263,25 @@ func (a *App) applyImdbUpdates(ratings map[string]ratingEntry, basics map[string } defer bStmt.Close() - genreStmt, err := tx.Prepare(` - INSERT INTO genre (imdb_id, name) - SELECT i.id, ? FROM imdb i WHERE i.imdb_id = ? + genreUpsert, err := tx.Prepare(` + INSERT INTO genre (name) VALUES (?) + ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id) `) if err != nil { tx.Rollback() - return fmt.Errorf("prepare genre insert: %w", err) + return fmt.Errorf("prepare genre upsert: %w", err) } - defer genreStmt.Close() + defer genreUpsert.Close() + + genreLink, err := tx.Prepare(` + INSERT INTO imdb_genre (imdb_id, genre_id) + VALUES ((SELECT i.id FROM imdb i WHERE i.imdb_id = ?), ?) + `) + if err != nil { + tx.Rollback() + return fmt.Errorf("prepare genre link: %w", err) + } + defer genreLink.Close() rCount, bCount, gCount := 0, 0, 0 @@ -295,9 +305,19 @@ func (a *App) applyImdbUpdates(ratings map[string]ratingEntry, basics map[string bCount++ for _, g := range b.Genres { - if _, err := genreStmt.Exec(g, id); err != nil { + res, err := genreUpsert.Exec(g) + if err != nil { + tx.Rollback() + return fmt.Errorf("upsert genre %s: %w", g, err) + } + genreID, err := res.LastInsertId() + if err != nil { + tx.Rollback() + return fmt.Errorf("get genre id: %w", err) + } + if _, err := genreLink.Exec(id, genreID); err != nil { tx.Rollback() - return fmt.Errorf("insert genre %s for %s: %w", g, id, err) + return fmt.Errorf("link genre %s for %s: %w", g, id, err) } gCount++ } @@ -340,8 +360,8 @@ func (a *App) fetchAndUpdateImdbData() error { } if err := a.DB.QueryRow(` SELECT COUNT(*) FROM imdb i - LEFT JOIN genre g ON g.imdb_id = i.id - WHERE g.id IS NULL + LEFT JOIN imdb_genre ig ON ig.imdb_id = i.id + WHERE ig.id IS NULL `).Scan(&missingGenres); err != nil { return fmt.Errorf("count genres: %w", err) } |
