Gorm AutoMigrate 表已存在,但仍尝试创建它

问题描述 投票:0回答:1

所以我在 GCP 上的 go 应用程序中使用 gorm。我有一个到 Postgres 云 SQL 数据库的连接。我有以下代码。

func CreateDBConnection(cfg *config.Config) (*gorm.DB, error) {
    // Build the connection string
    dsn := fmt.Sprintf("host=%s user=%s dbname=%s password=%s sslmode=disable",
        cfg.DatabaseHost, cfg.DatabaseUser, cfg.DatabaseName, cfg.DatabasePassword)
    // Open a database connection
    db, err := gorm.Open(postgres.New(postgres.Config{
        DriverName: "cloudsqlpostgres",
        DSN:        dsn,
    }))
    if err != nil {
        log.Fatal(err)
        return nil, err
    }

    // Migrate the schema
    err = db.AutoMigrate(&model.User{})
    if err != nil {
        log.Fatal(err)
        return nil, err
    }

    err = db.AutoMigrate(&model.ExerciseEvent{})
    if err != nil {
        log.Fatal(err)
        return nil, err
    }

    err = db.AutoMigrate(&model.HeartRecord{})
    if err != nil {
        log.Fatal(err)
        return nil, err
    }

    return db, nil
}
 

这个确切的代码块(特定型号除外)适用于另一个 go 应用程序。但是,当我运行此服务时,我在日志中收到以下内容

> [user-service-74b59f7fff-zdsfx user-service-container] 2023/08/09 15:13:46 refreshing ephemeral certificate for instance mynormative-grpc-dev:northamerica-northeast2:user-service-dev
      > [user-service-74b59f7fff-zdsfx user-service-container] 2023/08/09 15:13:47 Generated RSA key in 193.751709ms
      > [user-service-74b59f7fff-zdsfx user-service-container] 2023/08/09 15:13:47 Scheduling refresh of ephemeral certificate in 55m0s
      > [user-service-74b59f7fff-zdsfx user-service-container] 2023/08/09 15:13:47 pq: relation "users" already exists
      > [user-service-74b59f7fff-zdsfx user-service-container] 
      > [user-service-74b59f7fff-zdsfx user-service-container] 2023/08/09 15:13:47 /user-service/internal/repository/cloud_storage.go:28 pq: relation "users" already exists
      > [user-service-74b59f7fff-zdsfx user-service-container] [15.230ms] [rows:0] CREATE TABLE "users" [COLUMNS.....]

用户结构:

type User struct {
    gorm.Model
    Id              string
    Name            string
    Email           string
    Sex             string
    BirthDate       Timestamp
    Country         string
    EthnicitiesList pq.StringArray `gorm:"type:text[]"`
    Lifestage       string
    IsMenstruating  bool
    CycleDuration   int64
    IsCycleVariable bool
    PeriodDuration  int64
    LastPeriodDate  Timestamp
} 

服务随后关闭。我正在使用云代码在本地运行环境。这些模型的结构中有

gorm.Model
,我不确定这在其他地方是否有效。

go google-cloud-sql go-gorm
1个回答
0
投票

如果您在函数中定义它,您的问题将得到解决。例如

modelpage.go

func Userx(db *gorm.DB) error {
    err := db.AutoMigrate(
        &User{},
        &ExerciseEvent{},
        &HeartRecord{},
        
    )
    return err
    }

   

服务器页面.go

 err = model.Userx(db)
    if err != nil {
        log.Fatal(" could not migrate db")
    }
© www.soinside.com 2019 - 2024. All rights reserved.