fix: 修复了未自动迁移的表
This commit is contained in:
@@ -1,140 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"gorm.io/driver/postgres"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Config 数据库配置
|
|
||||||
type Config struct {
|
|
||||||
Host string
|
|
||||||
Port int
|
|
||||||
User string
|
|
||||||
Password string
|
|
||||||
DBName string
|
|
||||||
SSLMode string
|
|
||||||
}
|
|
||||||
|
|
||||||
type PostImage struct {
|
|
||||||
ID string `gorm:"type:varchar(36);primaryKey"`
|
|
||||||
PostID string `gorm:"type:varchar(36);index"`
|
|
||||||
URL string `gorm:"type:text"`
|
|
||||||
ThumbnailURL string `gorm:"type:text"`
|
|
||||||
PreviewURL string `gorm:"type:text"`
|
|
||||||
PreviewURLLarge string `gorm:"type:text"`
|
|
||||||
Width int `gorm:"default:0"`
|
|
||||||
Height int `gorm:"default:0"`
|
|
||||||
Size int64 `gorm:"default:0"`
|
|
||||||
MimeType string `gorm:"type:varchar(50)"`
|
|
||||||
SortOrder int `gorm:"default:0"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (PostImage) TableName() string {
|
|
||||||
return "post_images"
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// 解析命令行参数
|
|
||||||
host := flag.String("host", "localhost", "数据库主机")
|
|
||||||
port := flag.Int("port", 5432, "数据库端口")
|
|
||||||
user := flag.String("user", "postgres", "数据库用户")
|
|
||||||
password := flag.String("password", "", "数据库密码")
|
|
||||||
dbname := flag.String("dbname", "carrot_bbs", "数据库名称")
|
|
||||||
sslmode := flag.String("sslmode", "disable", "SSL 模式")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
cfg := &Config{
|
|
||||||
Host: *host,
|
|
||||||
Port: *port,
|
|
||||||
User: *user,
|
|
||||||
Password: *password,
|
|
||||||
DBName: *dbname,
|
|
||||||
SSLMode: *sslmode,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 连接数据库
|
|
||||||
dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s",
|
|
||||||
cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.DBName, cfg.SSLMode)
|
|
||||||
|
|
||||||
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to connect to database: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试连接
|
|
||||||
sqlDB, err := db.DB()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to get database instance: %v", err)
|
|
||||||
}
|
|
||||||
defer sqlDB.Close()
|
|
||||||
|
|
||||||
if err := sqlDB.Ping(); err != nil {
|
|
||||||
zap.L().Fatal("Failed to ping database", zap.Error(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
zap.L().Info("Connected to database")
|
|
||||||
|
|
||||||
// 运行迁移
|
|
||||||
if err := runMigration(db); err != nil {
|
|
||||||
zap.L().Fatal("Migration failed", zap.Error(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
zap.L().Info("Migration completed successfully")
|
|
||||||
}
|
|
||||||
|
|
||||||
func runMigration(db *gorm.DB) error {
|
|
||||||
// 检查字段是否已存在
|
|
||||||
columns, err := db.Migrator().ColumnTypes(&PostImage{})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to check column existence: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
hasPreviewURL := false
|
|
||||||
hasPreviewURLLarge := false
|
|
||||||
for _, col := range columns {
|
|
||||||
if col.Name() == "preview_url" {
|
|
||||||
hasPreviewURL = true
|
|
||||||
}
|
|
||||||
if col.Name() == "preview_url_large" {
|
|
||||||
hasPreviewURLLarge = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if hasPreviewURL && hasPreviewURLLarge {
|
|
||||||
zap.L().Info("Columns already exist, skipping migration")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 添加字段
|
|
||||||
var errs []error
|
|
||||||
if !hasPreviewURL {
|
|
||||||
zap.L().Info("Adding preview_url column...")
|
|
||||||
if err := db.Exec("ALTER TABLE post_images ADD COLUMN preview_url TEXT").Error; err != nil {
|
|
||||||
errs = append(errs, fmt.Errorf("failed to add preview_url column: %w", err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !hasPreviewURLLarge {
|
|
||||||
zap.L().Info("Adding preview_url_large column...")
|
|
||||||
if err := db.Exec("ALTER TABLE post_images ADD COLUMN preview_url_large TEXT").Error; err != nil {
|
|
||||||
errs = append(errs, fmt.Errorf("failed to add preview_url_large column: %w", err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(errs) > 0 {
|
|
||||||
return errors.Join(errs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
zap.L().Info("Migration completed successfully")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注意:此脚本仅用于添加数据库字段
|
|
||||||
// 预览图的生成由后端的 upload_service 自动处理
|
|
||||||
// 现有图片需要重新上传才能生成预览图,或者编写额外的后台任务来生成
|
|
||||||
@@ -133,6 +133,11 @@ func autoMigrate(db *gorm.DB) error {
|
|||||||
&SensitiveWord{},
|
&SensitiveWord{},
|
||||||
&AuditLog{},
|
&AuditLog{},
|
||||||
|
|
||||||
|
// 日志相关
|
||||||
|
&OperationLog{}, // 操作日志
|
||||||
|
&LoginLog{}, // 登录日志
|
||||||
|
&DataChangeLog{}, // 数据变更日志
|
||||||
|
|
||||||
// 群组相关
|
// 群组相关
|
||||||
&Group{},
|
&Group{},
|
||||||
&GroupMember{},
|
&GroupMember{},
|
||||||
|
|||||||
Reference in New Issue
Block a user