// Command migrate_refresh 一次性建表脚本(与 scripts/sql/*.sql 同源,手写 DDL 以保持与项目"SQL 托管表结构"约定一致)。 // // 运行:go run ./scripts/migrate_refresh // 可用环境变量 DB_DSN 覆盖连接串(默认 root:root@127.0.0.1:3306/db_dev)。 package main import ( "log" "os" "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { dsn := os.Getenv("DB_DSN") if dsn == "" { dsn = "root:root@tcp(127.0.0.1:3306)/db_dev?charset=utf8mb4&parseTime=True&loc=Local" } db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf("open db: %v", err) } stmt := `CREATE TABLE IF NOT EXISTS refresh_tokens ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id INT UNSIGNED NOT NULL, token_hash VARCHAR(64) NOT NULL, expires_at INT UNSIGNED NOT NULL DEFAULT 0, revoked TINYINT UNSIGNED NOT NULL DEFAULT 0, user_agent VARCHAR(255) NOT NULL DEFAULT '', ip VARCHAR(64) NOT NULL DEFAULT '', created_at INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE KEY uk_token_hash (token_hash), KEY idx_user_id (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;` if err := db.Exec(stmt).Error; err != nil { log.Fatalf("create refresh_tokens: %v", err) } log.Println("✓ refresh_tokens ready") }