From bb6447e975ded0df5ea9f1e988ca525e4ecad034 Mon Sep 17 00:00:00 2001 From: wood chen Date: Sat, 28 Sep 2024 15:39:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/database.go | 56 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/core/database.go b/core/database.go index a17ab7f..f5b9498 100644 --- a/core/database.go +++ b/core/database.go @@ -3,6 +3,7 @@ package core //数据库处理 import ( "database/sql" + "fmt" "os" "path/filepath" "strings" @@ -377,13 +378,46 @@ func (d *Database) MigrateExistingKeywords() error { } if oldTableName == "keywords" { + // 获取旧表的列信息 + rows, err := d.db.Query("PRAGMA table_info(keywords)") + if err != nil { + return err + } + defer rows.Close() + + var columns []string + for rows.Next() { + var cid int + var name, type_ string + var notnull, pk int + var dflt_value interface{} + err = rows.Scan(&cid, &name, &type_, ¬null, &dflt_value, &pk) + if err != nil { + return err + } + columns = append(columns, name) + } + + // 构建插入语句 + insertColumns := []string{"keyword"} + selectColumns := []string{"keyword"} + for _, col := range []string{"is_link", "is_auto_added", "added_at"} { + if contains(columns, col) { + insertColumns = append(insertColumns, col) + selectColumns = append(selectColumns, col) + } else { + selectColumns = append(selectColumns, "FALSE") + } + } + // 迁移数据 - _, err = d.db.Exec(`INSERT OR IGNORE INTO keywords_new (keyword, is_link, is_auto_added, added_at) - SELECT keyword, - COALESCE(is_link, FALSE), - COALESCE(is_auto_added, FALSE), - COALESCE(added_at, CURRENT_TIMESTAMP) - FROM keywords`) + query := fmt.Sprintf(`INSERT OR IGNORE INTO keywords_new (%s) + SELECT %s + FROM keywords`, + strings.Join(insertColumns, ", "), + strings.Join(selectColumns, ", ")) + + _, err = d.db.Exec(query) if err != nil { return err } @@ -409,3 +443,13 @@ func (d *Database) MigrateExistingKeywords() error { return nil } + +// 辅助函数:检查切片中是否包含特定字符串 +func contains(slice []string, str string) bool { + for _, v := range slice { + if v == str { + return true + } + } + return false +}