可以批量跑出存在大于某个大小产品图库的所有产品ID,也可以调整下输出,处理图片或者再写个压缩的函数进行压缩。实际测试跑5000多个产品,21秒钟跑完了,速度很快。
代码:
package main
import (
"database/sql"
"flag"
"fmt"
"log"
"os"
"strings"
"time"
_ "github.com/go-sql-driver/mysql"
)
type Product struct {
ID int
Title string
FeaturedImage string
ProductImageGallery sql.NullString
}
var (
dbName string
dbUser string
dbPass string
dbURL string
filePath string
website string
)
func init() {
flag.StringVar(&dbName, "dbname", "", "MySQL数据库名")
flag.StringVar(&dbUser, "dbuser", "", "MySQL数据库用户")
flag.StringVar(&dbPass, "dbpass", "", "MySQL数据库密码")
flag.StringVar(&dbURL, "dburl", "", "MySQL数据库URL")
flag.StringVar(&filePath, "filepath", "", "用于替换GUID的文件路径前缀")
flag.StringVar(&website, "website", "", "要在GUID中替换的网站URL前缀")
flag.Parse()
if dbName == "" || dbUser == "" || dbPass == "" || dbURL == "" || filePath == "" || website == "" {
log.Fatal("请提供所有必需的命令行参数")
}
}
func main() {
// 用法,可以编译后使用,例子:go run main.go -dbname=数据库名 -dbuser=数据库账户 -dbpass=数据库密码 -dburl=数据库地址 -filepath=站点路径 -website=站点域名
// 例子:go run main.go -dbname=数据库名 -dbuser=数据库账户 -dbpass=数据库密码 -dburl=数据库地址 -filepath=/www/wwwroot/kekc.cn -website=https://www.kekc.cn
// 执行步骤
// 1、获取所有产品(ID)
// 2、根据获取的产品ID获取产品图库
// 3、获取图片的网址,替换成路径
// 4、判断图片大小,大于300KB则将product.ID存入当前目录下的list.txt文件中
// 最后再去重之类的处理,得到所有存在大于300KB的产品。
startTime := time.Now()
// 构建数据库连接字符串
dbConnectionString := fmt.Sprintf("%s:%s@tcp(%s)/%s", dbUser, dbPass, dbURL, dbName)
// 替换为你的数据库连接信息
db, err := sql.Open("mysql", dbConnectionString)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 查询产品的基本信息以及 _product_image_gallery 和 _wp_attached_file
rows, err := db.Query(`
SELECT p.ID, p.post_title, p.guid, m.meta_value
FROM wp_posts p
LEFT JOIN wp_postmeta m ON p.ID = m.post_id AND m.meta_key = '_product_image_gallery'
WHERE p.post_type = 'product'
`)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var products []Product
for rows.Next() {
var product Product
err := rows.Scan(&product.ID, &product.Title, &product.FeaturedImage, &product.ProductImageGallery)
if err != nil {
log.Fatal(err)
}
products = append(products, product)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
// 检查是否有list.txt文件,没有则创建
_, err = os.Stat("list.txt")
if os.IsNotExist(err) {
file, err := os.Create("list.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
}
for _, product := range products {
fmt.Printf("产品ID:%d\n", product.ID)
fmt.Printf("产品标题:%s\n", product.Title)
fmt.Printf("特色图片URL:%s\n", product.FeaturedImage)
// 如果 ProductImageGallery 有效,则拆分并遍历
if product.ProductImageGallery.Valid {
imageIDs := strings.Split(product.ProductImageGallery.String, ",")
// 遍历每个图像的 ID,并获取 GUID
for _, imageID := range imageIDs {
guid, err := getImageGuid(db, imageID)
if err != nil {
log.Println(err)
continue
}
// 替换GUID中的字符串
replacedGuid := strings.Replace(guid, website, filePath, -1)
// 获取文件大小
size, err := getFileSize(replacedGuid)
if err != nil {
log.Println(err)
continue
}
fmt.Printf("图像ID:%s,修改后的GUID:%s,大小:%d 字节\n", imageID, replacedGuid, size)
// 判断文件大小是否大于300KB,如果是,则将product.ID追加到list.txt里
if size > 300*1024 {
err := appendToList("list.txt", fmt.Sprintf("%d\n", product.ID))
if err != nil {
log.Println(err)
}
}
}
} else {
fmt.Println("产品图像库为空")
}
fmt.Println("------------------------")
}
elapsedTime := time.Since(startTime)
fmt.Printf("总执行时间:%s\n", elapsedTime)
}
func getImageGuid(db *sql.DB, imageID string) (string, error) {
var guid string
err := db.QueryRow("SELECT guid FROM wp_posts WHERE ID = ?", imageID).Scan(&guid)
if err != nil {
if err == sql.ErrNoRows {
return "", fmt.Errorf("找不到图像ID:%s的行", imageID)
}
return "", err
}
return guid, nil
}
func getFileSize(filePath string) (int64, error) {
fileInfo, err := os.Stat(filePath)
if err != nil {
return 0, err
}
return fileInfo.Size(), nil
}
func appendToList(fileName, content string) error {
file, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return err
}
defer file.Close()
if _, err := file.WriteString(content); err != nil {
return err
}
return nil
}
© 版权声明
THE END
暂无评论内容