升级某个包:
用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-12-08 00:39