所以我在 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
,我不确定这在其他地方是否有效。
如果您在函数中定义它,您的问题将得到解决。例如
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")
}