From f68a8f880d1be10add5f7e3a2659627df7e05ee8 Mon Sep 17 00:00:00 2001 From: lychang <632945494@qq.com> Date: Tue, 21 Jul 2026 01:43:16 +0800 Subject: [PATCH] update code level --- migrations/005_cleanup.sql | 34 ++++++++++++++++++++++++++-------- src/cache/mod.rs | 17 +++++++++-------- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/migrations/005_cleanup.sql b/migrations/005_cleanup.sql index e2f54b4..ce54db4 100644 --- a/migrations/005_cleanup.sql +++ b/migrations/005_cleanup.sql @@ -1,11 +1,29 @@ --- 移除不再使用的扩展列(数据已迁移到 search.db.bak) --- SQLite 3.35.0+ 支持 ALTER TABLE DROP COLUMN +-- 清理不再使用的扩展列(安全重建方式) +-- 通过重建表来移除列,兼容列已存在或已删除的任意状态 --- 先删除引用这些列的索引 DROP INDEX IF EXISTS idx_albums_cleaned; -ALTER TABLE albums DROP COLUMN tags; -ALTER TABLE albums DROP COLUMN all_words; -ALTER TABLE albums DROP COLUMN person_name_original; -ALTER TABLE albums DROP COLUMN person_name_cleaned; -ALTER TABLE albums DROP COLUMN raw_title; +-- 重建 albums 表,只保留需要的列 +CREATE TABLE IF NOT EXISTS albums_v2 ( + id TEXT PRIMARY KEY NOT NULL, + title TEXT NOT NULL DEFAULT '', + document TEXT DEFAULT '', + description TEXT, + cover_image_id TEXT, + image_count INTEGER NOT NULL DEFAULT 0, + created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')) +); + +-- 安全复制数据(SELECT 只取确定存在的列) +INSERT OR IGNORE INTO albums_v2 (id, title, document, description, cover_image_id, image_count, created_at) +SELECT id, title, + COALESCE(document, ''), + description, + cover_image_id, + image_count, + created_at +FROM albums; + +-- 替换旧表 +DROP TABLE IF EXISTS albums; +ALTER TABLE albums_v2 RENAME TO albums; diff --git a/src/cache/mod.rs b/src/cache/mod.rs index c4fd60b..2edb018 100644 --- a/src/cache/mod.rs +++ b/src/cache/mod.rs @@ -215,22 +215,23 @@ pub async fn refresh_all_caches( persons_cache: &Arc>, tags_cache: &Arc>, ) { - // 1. 从主库读取相册(含 tags 和 persons 关联) + // 1. 从主库读取相册(tags 和 persons 从 search.db 关联) if let Ok(albums) = db.get_all_albums().await { - // 批量获取 album → tags 映射 - let tag_rows = sqlx::query("SELECT album_id, tag FROM album_tags") - .fetch_all(&db.pool).await.unwrap_or_default(); + // 从 search.db 批量获取 album → tags 映射 + let tag_rows = sqlx::query( + r#"SELECT at.album_id, t.name FROM album_tags at JOIN tags t ON at.tag_id = t.id"# + ).fetch_all(&search_db.pool).await.unwrap_or_default(); let mut album_tags: std::collections::HashMap> = std::collections::HashMap::new(); for r in &tag_rows { let aid: String = r.get("album_id"); - let tag: String = r.get("tag"); + let tag: String = r.get("name"); album_tags.entry(aid).or_default().push(tag); } - // 批量获取 album → persons 映射 + // 从 search.db 批量获取 album → persons 映射 let person_rows = sqlx::query( - r#"SELECT pa.album_id, p.name FROM person_albums pa JOIN persons p ON pa.person_id = p.id"# - ).fetch_all(&db.pool).await.unwrap_or_default(); + r#"SELECT ap.album_id, p.name FROM album_persons ap JOIN persons p ON ap.person_id = p.id"# + ).fetch_all(&search_db.pool).await.unwrap_or_default(); let mut album_persons: std::collections::HashMap> = std::collections::HashMap::new(); for r in &person_rows { let aid: String = r.get("album_id");