package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
)
type DBConfig struct {
User string
Password string
Host string
Port string
DBName string
}
func (config *DBConfig) DSN() string {
return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", config.User, config.Password, config.Host, config.Port, config.DBName)
}
func updateUser(dbAConfig, dbBConfig *DBConfig) {
dbA, err := sql.Open("mysql", dbAConfig.DSN())
if err != nil {
log.Fatalf("连接数据库A失败: %v", err)
}
defer dbA.Close()
dbB, err := sql.Open("mysql", dbBConfig.DSN())
if err != nil {
log.Fatalf("连接数据库B失败: %v", err)
}
defer dbB.Close()
rows, err := dbA.Query(`SELECT
s1.username, s1.followers, s1.posts, s1.createTime
FROM
spider_media_user s1
JOIN (
SELECT
username,
MAX(createTime) AS latest_createTime
FROM
spider_media_user
GROUP BY
username
) s2 ON s1.username = s2.username AND s1.createTime = s2.latest_createTime;`)
if err != nil {
log.Fatalf("从数据库A读取数据失败: %v", err)
}
defer rows.Close()
updateStmt, err := dbB.Prepare(`UPDATE account_info SET followers_count = ?, posts_count = ?, update_time = ? WHERE account_name = ?`)
if err != nil {
log.Fatalf("准备更新语句失败: %v", err)
}
defer updateStmt.Close()
for rows.Next() {
var username string
var followers sql.NullInt64
var posts sql.NullInt64
var createTime string
err := rows.Scan(&username, &followers, &posts, &createTime)
if err != nil {
log.Fatalf("扫描数据失败: %v", err)
}
_, err = updateStmt.Exec(followers, posts, createTime, username)
if err != nil {
log.Fatalf("更新数据到数据库B失败: %v", err)
} else {
fmt.Println("更新成功: ", username)
}
}
if err = rows.Err(); err != nil {
log.Fatalf("读取数据时发生错误: %v", err)
}
fmt.Println("数据更新完成!")
}
func main() {
dbAConfig := &DBConfig{
User: "",
Password: "",
Host: "",
Port: "",
DBName: "",
}
dbBConfig := &DBConfig{
User: "",
Password: "",
Host: "127.0.0.1",
Port: "3306",
DBName: "",
}
updateUser(dbAConfig, dbBConfig)
}