package database import ( "database/sql" "fmt" "log" "os" _ "modernc.org/sqlite" ) var DB *sql.DB // InitDB 初始化数据库 func InitDB(dbPath string) error { var err error log.Printf("[DB] 初始化数据库: path=%s", dbPath) // 确保数据库目录存在 dir := "./data" if _, err := os.Stat(dir); os.IsNotExist(err) { log.Printf("[DB] 数据库目录不存在, 创建: %s", dir) os.MkdirAll(dir, 0755) } // 打开数据库连接 DB, err = sql.Open("sqlite", dbPath) if err != nil { return fmt.Errorf("打开数据库失败: %w", err) } // 创建表 err = createTables() if err != nil { return fmt.Errorf("创建表失败: %w", err) } log.Printf("[DB] 数据库初始化完成") return nil } // PlaceholderDownPrice float64 `json:"placeholderDownPrice"` // 占位降价 默认0.01 // MinShippingFee float64 `json:"minShippingFee"` // 最低运费 // MinPrice float64 `json:"minPrice"` // 最低书价 // // createTables 创建数据表 func createTables() error { sql := ` CREATE TABLE IF NOT EXISTS goods_pricing ( id INTEGER PRIMARY KEY AUTOINCREMENT, isbn TEXT, book_name TEXT, author TEXT, publishing TEXT, out_id TEXT, quality TEXT, query_index INTEGER DEFAULT 0, user_id TEXT, price REAL, shipping_fee REAL, placeholder_down_price REAL, -- 占位降价 min_shipping_fee REAL, -- 最低运费 min_price REAL, -- 最低书价 final_price REAL, -- 最终价格 fail_count INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS kfz_token ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL DEFAULT '', token TEXT NOT NULL, is_enable INTEGER DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_isbn ON goods_pricing(isbn); CREATE INDEX IF NOT EXISTS idx_out_id ON goods_pricing(out_id); CREATE TABLE IF NOT EXISTS kfz_config ( id INTEGER PRIMARY KEY AUTOINCREMENT, new_price REAL, placeholder_down_price REAL, min_shipping_fee REAL, min_price REAL, query_index INTEGER DEFAULT 0 ); ` _, err := DB.Exec(sql) if err != nil { return err } // 兼容旧表:添加 password 列(已存在则忽略) DB.Exec(`ALTER TABLE kfz_token ADD COLUMN password TEXT NOT NULL DEFAULT ''`) return nil } // CloseDB 关闭数据库连接 func CloseDB() error { if DB != nil { return DB.Close() } return nil }