升级某个包:
用go get -u会自动下载最新依赖包并更新mod文件,为了更新sum文件,则需要执行go mod tidy,在更新了go.mod文件后,可以通过运行以下命令来更新go.sum文件: go mod tidy 该命令将根据go.mod文件中的最新依赖项列表,go mod tidy 命令的作用是清理未使用的依赖,并更新 go.mod 以及 go.sum 文件。

升级gorm,就是把最新的下载,并且修改go.mod里的版本信息到最新的。
D:\gowork\src\github.com\3xxx\engineercms>go get gorm.io/gorm
go: downloading gorm.io/gorm v1.25.12
go: upgraded gorm.io/gorm v1.24.3 => v1.25.12

D:\gowork\src\github.com\3xxx\engineercms>go get gorm.io/driver/sqlite
go: downloading gorm.io/driver/sqlite v1.5.6
go: warning: github.com/mattn/go-sqlite3@v2.0.3+incompatible: retracted by module author: Accidental; no major changes or features.
go: to switch to the latest unretracted version, run:
        go get github.com/mattn/go-sqlite3@latest
go: upgraded gorm.io/driver/sqlite v1.4.4 => v1.5.6

D:\gowork\src\github.com\3xxx\engineercms>go get github.com/mattn/go-sqlite3@latest
go: downloading github.com/mattn/go-sqlite3 v1.14.24
go: downloading github.com/onsi/ginkgo v1.7.0
go: downloading github.com/onsi/gomega v1.4.3
go: downloading gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15
go: removed github.com/casbin/beego-orm-adapter/v3 v3.0.2
go: downgraded github.com/mattn/go-sqlite3 v2.0.3+incompatible => v1.14.24

D:\gowork\src\github.com\3xxx\engineercms>go get github.com/casbin/beego-orm-adapter/v3
go: added github.com/casbin/beego-orm-adapter/v3 v3.2.0
go: upgraded github.com/mattn/go-sqlite3 v1.14.24 => v2.0.3+incompatible

升级casbin
D:\gowork\src\github.com\engineercms>go get github.com/casbin/casbin/v2
go: added github.com/bmatcuk/doublestar/v4 v4.6.1
go: upgraded github.com/casbin/casbin/v2 v2.60.0 => v2.100.0
go: added github.com/casbin/govaluate v1.2.0

升级excelize
D:\gowork\src\github.com\engineercms>go get github.com/xuri/excelize/v2
go: downloading github.com/stretchr/testify v1.8.4
go: upgraded github.com/richardlehane/msoleps v1.0.3 => v1.0.4
go: upgraded github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 => v0.0.0-20240408161823-9ad904a10d6d
go: upgraded github.com/xuri/excelize/v2 v2.6.1 => v2.9.0
go: upgraded github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 => v0.0.0-20240318013403-ab9948c2c4a7
go: upgraded golang.org/x/crypto v0.21.0 => v0.28.0
go: upgraded golang.org/x/image v0.5.0 => v0.18.0
go: upgraded golang.org/x/net v0.22.0 => v0.30.0
go: upgraded golang.org/x/sys v0.18.0 => v0.26.0
go: upgraded golang.org/x/text v0.14.0 => v0.19.0

提示说没有更新go.sum,需要执行下面的命令,把一些内容写入go.sum
D:\gowork\src\github.com\engineercms>go get github.com/disintegration/imaging@v1.6.2

D:\gowork\src\github.com\engineercms>go get github.com/hhrutter/tiff@v0.0.0-20190829141212-736cae8d0bc7

D:\gowork\src\github.com\engineercms>go get github.com/holys/initials-avatar@v0.0.0-20180809162153-a82edcad3408

D:\gowork\src\github.com\engineercms>go get github.com/holys/initials-avatar@v0.0.0-20180809162153-a82edcad3408

D:\gowork\src\github.com\engineercms>go get github.com/pdfcpu/pdfcpu/pkg/pdfcpu@v0.3.13

D:\gowork\src\github.com\engineercms> go get golang.org/x/crypto/argon2@v0.28.0

D:\gowork\src\github.com\engineercms>go get github.com/kardianos/service@v1.2.2

https://beego.wiki/zh-cn/docs/
https://beego.wiki/docs/module/task/
https://doc.meoying.com/en-US/beego/developing/orm/
1.beego删除了adapter里的logs,validation,……改到core和client文件夹下了

用代理加速clone
D:\gowork\src\github.com>go env -w GOPROXY=https://goproxy.io,direct
D:\gowork\src\github.com>git clone https://github.com/3xxx/engineercms.git

https://www.cnblogs.com/infodriven/p/16351624.html

(十三)GORM 自动建表(Migration特性)

GORM支持Migration特性,支持根据Go Struct结构自动生成对应的表结构。

注意:GORM 的AutoMigrate函数,仅支持建表,不支持修改字段和删除字段,避免意外导致丢失数据。

一、自动迁移(第一次建表)

通过AutoMigrate函数可以快速建表,如果表已经存在不会重复创建。

// 根据User结构体,自动创建表结构.
db.AutoMigrate(&User{})

// 一次创建User、Product、Order三个结构体对应的表结构
db.AutoMigrate(&User{}, &Product{}, &Order{})

// 可以通过Set设置附加参数,下面设置表的存储引擎为InnoDB
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})

二、Schema方法

1、检测表是否存在
// 检测User结构体对应的表是否存在
db.Migrator().HasTable(&User{})

// 检测表名users是否存在
db.Migrator().HasTable("users")
2、建表
// 根据User结构体建表
db.Migrator().CreateTable(&User{})
3、删除表
// 删除User结构体对应的表
db.Migrator().DropTable(&User{})

// 删除表名为users的表
db.Migrator().DropTable("users")
4、删除字段
// 删除User结构体对应表中的description字段
db.Migrator().DropColumn(&User{}, "Name")
5、添加索引
type User struct {
  gorm.Model
  Name string `gorm:"size:255;index:idx_name,unique"`
}

// 为 Name 字段创建索引
db.Migrator().CreateIndex(&User{}, "Name")
db.Migrator().CreateIndex(&User{}, "idx_name")

// 为 Name 字段删除索引
db.Migrator().DropIndex(&User{}, "Name")
db.Migrator().DropIndex(&User{}, "idx_name")

// 检查索引是否存在
db.Migrator().HasIndex(&User{}, "Name")
db.Migrator().HasIndex(&User{}, "idx_name")

type User struct {
  gorm.Model
  Name  string `gorm:"size:255;index:idx_name,unique"`
  Name2 string `gorm:"size:255;index:idx_name_2,unique"`
}
// 修改索引名
db.Migrator().RenameIndex(&User{}, "Name", "Name2")
db.Migrator().RenameIndex(&User{}, "idx_name", "idx_name_2")

三、组合索引

两个字段使用同一个索引名,Migration将创建复合索引,例如:

type User struct {
    Name   string `gorm:"index:idx_member"`
    Number string `gorm:"index:idx_member"`
}

golang 动态更新表结构

发布时间:2024-10-27 09:39:43

动态更新表结构是在开发过程中常见的需求之一。在使用Golang进行开发时,可以利用GORM库轻松地实现动态更新表结构的功能。本文将详细介绍如何使用GORM进行动态更新表结构,并探讨其实际应用场景。 ## GORM简介 GORM是一个强大的ORM(对象关系映射)库,提供了许多便捷的功能,例如数据库迁移、查询构建以及模型定义等。在Golang开发中,GORM被广泛应用于与数据库交互。 ## 动态更新表结构 在实际开发中,我们经常需要根据需求变化来修改数据库表结构。如果手动修改表结构,往往会引起数据丢失或冗余。而使用GORM,可以方便地实现动态更新表结构而不丢失数据。 下面是一个示例,展示了如何使用GORM进行动态更新表结构的操作:

package main
import ( "fmt" "gorm.io/gorm" "gorm.io/driver/mysql" )

type User struct {
 ID uint `gorm:"primaryKey"`
 Name string `gorm:"size:255"`
}

func main() {
 dsn := "root:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
 db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
 if err != nil {
  panic("failed to connect database")
}

// 将User模型映射到users表
db.AutoMigrate(&User{})

// 更新表结构,添加Age字段
db.Migrator().AddColumn(&User{}, "Age")

// 更新表结构,修改Name字段
db.Migrator().RenameColumn(&User{}, "Name", "Username")

// 更新表结构,删除Age字段
db.Migrator().DropColumn(&User{}, "Age")

fmt.Println("Table structure updated successfully!")
}

上述示例中,通过db.Migrator()方法可以获取到迁移器对象,然后可以使用其提供的一系列方法实现对表结构的动态更新。
例如,通过AddColumn方法可以添加新的字段,通过RenameColumn方法可以修改字段名,通过DropColumn方法可以删除字段。

动态更新表结构的应用场景

动态更新表结构功能在很多场景下都非常有用。
下面列举了几个常见的应用场景:

静态配置表

在一些系统中,可能需要将静态的配置信息存储在数据库中。这些配置项可以在运行时动态修改,然后通过动态更新表结构来保证配置项的准确性和完整性。
例如,我们可以创建一个名为config的表,并存储一些静态配置项,例如:config_key和config_value。当配置项发生变化时,只需要更新表结构中的config_key和config_value对应的字段即可。

插件系统

在一些系统中,可能存在插件功能。插件可以是一个独立的功能模块,可以通过动态更新表结构实现对插件的扩展。
例如,我们可以创建一个名为plugins的表,存储插件的信息,包括插件名、版本号等。当需要添加新的插件时,只需要向表结构中添加新的字段即可。

用户自定义字段

在一些系统中,可能需要支持用户自定义字段。这时候可以使用动态更新表结构的功能实现用户自定义字段的添加、删除和修改。
例如,我们可以创建一个名为user_info的表,存储用户的信息。当用户需要添加自定义字段时,只需要向表结构中添加新的字段即可。

小结

使用GORM进行动态更新表结构是一种非常便捷和灵活的方式。通过灵活运用迁移器对象提供的方法,可以在不丢失数据的情况下修改数据库表结构。动态更新表结构的应用场景非常广泛,例如静态配置表、插件系统以及用户自定义字段等。对于需要频繁修改表结构的项目来说,使用GORM进行动态更新表结构将会带来很大的便利。
综上所述,使用GORM进行动态更新表结构是一种十分实用的方法,可以在开发过程中节省时间和精力,同时又能满足动态更新表结构的需求。如果你是一名Golang开发者,不妨尝试使用GORM来实现动态更新表结构,相信会给你带来不错的开发体验。

如何升级和降级依赖项

记住,go get -u会自动升级和更新mod
例如,无需 clone 仓库中的代码,直接在项目目录中执行
go get -u github.com/wechatpay-apiv3/wechatpay-go

  • zhaoying818/go GitHub Wiki

应该使用go get来完成日常升级和降级依赖项,这将自动更新go.mod文件。 或者,你也可以直接编辑go.mod。
此外,诸如go build,go test或甚至go list之类的命令将根据需要自动添加新的依赖项以满足导入(更新go.mod并下载新的依赖项)。
要查看所有直接和间接依赖项的可用次要和补丁升级,请运行go list -u -m all。
更新当前模块的所有直接和间接依赖到最新版本:
运行go get -u去使用最新的次要或补丁版本
运行go get -u=patch去使用最新补丁版本
go get foo更新到最新版本的foo。
go get foo相当于go get foo @latest —— 换句话说,如果没有指定@版本,@latest是默认值。
在本节中,”latest”是带有[semver](https://semver.org/)标记的最新版本,如果没有semver标记,则是最新的已知commit提交。 除非存储库中没有其他semver标记,否则预发布标记不会被选为”最新”(详细信息)。
一个常见的错误是认为go get -u foo只能获得foo的最新版本。
实际上,go get -u foo或go get -u foo@latest中的-u意味着也可以获取foo的直接和间接依赖所有的最新版本。
升级foo的一个常见起点是运行go get foo或go get foo@latest而不用-u(一切正常后,再考虑go get -u=patch foo,go get -u=patch,go get -u foo或go get -u)。

要升级或降级到更具体的版本,’go get’允许通过添加@version后缀或”模块查询” 来覆盖版本选择的包参数,例如go get foo @v1.6.2,go get foo@e3702bed2,或go get foo @’ < v1.6.2’
使用诸如go get foo@master之类的分支名称是获取最新提交的一种方式,无论它是否具有semver标记。
通常,不解析为semver标记的模块查询将在go.mod文件中记录为伪版本。
请参阅”模块感知go get”和”模块查询”中go命令文档的部分,以获取有关这些主题的更多信息。
模块能够使用尚未引入模块的软件包,包括在go.mod中记录任何可用的semver标签,并使用这些semver标签进行升级或降级。 模块也可以使用没有任何正确的semver标签的软件包(在这种情况下,它们将使用go.mod中的伪版本进行记录)。
在升级或降级任何依赖项之后,你可能希望为构建(包括直接和间接依赖)的所有包运行测试以检查不兼容性:
$ go test all

gorm不更新0值的解决

    // 通过 `Assign` 属性 更新记录——下面用的是`struct`,所以0值不会更新
    // db.Where(User{Name: "jinzhu"}).Assign(User{Age: 20}).FirstOrCreate(&user)
    // assign非常好用,如果存在了,则只更新某个字段,用`map`就能更新0值了
    err = db.Where("business_id = ? AND user_id = ? AND Select_date = ?", businessid, userid, SelectDate).Assign(map[string]interface{}{"allowance": allowance}).FirstOrCreate(&businesscheckin).Error
    // 根据 `struct` 更新属性,只会更新非零值的字段
    // db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
    // 根据 `map` 更新属性
    // db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})

gorm乐观锁知识

作者:秦晓川  创建时间:2024-10-26 08:30
最后编辑:秦晓川  更新时间:2024-12-08 00:39