站点介绍 置顶
该博客站于2024-4-30全新升级,用于记录日常开发中遇到的问题,以及一些新闻热搜
个人承接PHP二次开发、网站定制、公众号小程序定制开发、网站源码搭建、服务器维护等业务
出租宝塔专业版账号,里面包含网站监控、nginx防火墙、网站防篡改等插件,长期租用价格优惠
联系微信:admin_1998
联系QQ:1401586744
Golang gorm demo2 Golang
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"time"
)
// 定义模型
type Admin struct {
ID uint `gorm:"primaryKey;not null"`
Username string `gorm:"size:100;not null"`
Password string `gorm:"size:200;not null"`
Nickname string `gorm:"size:100"`
CreatedAt time.Time `gorm:"type:datetime"`
UpdatedAt time.Time `gorm:"type:datetime"`
}
var DB *gorm.DB
func main(){
dsn := "test:test@tcp(127.0.0.1:3306)/gormdemo1?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "la_", // 设置表前缀
SingularTable: false, // 禁用表名复数
},
})
if err != nil {
fmt.Println("数据库连接失败")
}
DB = db
// 创建表
DB.AutoMigrate(&Admin{})
// 添加数据
admin1 := Admin{
Username:"admin",
Password:"pwd",
Nickname:"nickadm",
}
DB.Create(&admin1)
if admin1.ID > 0 {
fmt.Println("创建成功")
}
var searchadm1 Admin
DB.Find(&searchadm1,3)
fmt.Println(searchadm1)
if searchadm1.ID > 0 {
DB.Delete(searchadm1)
}
fmt.Println("执行完成")
}
Golang gorm demo1 Golang
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"time"
)
// 定义用户模型
type User struct {
ID uint `gorm:"primaryKey;not null"`
Name string `gorm:"size:100"`
Mobile string `gorm:"uniqueIndex;size:20"`
CreatedAt time.Time
UpdatedAt time.Time
}
func main(){
dsn := "root:123456@tcp(127.0.0.1:3306)/gormdemo1?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "tes_", // 设置表前缀
SingularTable: false, // 禁用表名复数
},
})
if err != nil {
fmt.Println("数据库连接失败: %v", err)
}
fmt.Println("数据库连接成功!")
err = db.AutoMigrate(&User{})
if err != nil {
fmt.Println("创建User表失败: %v", err)
}
fmt.Println("创建User表成功")
// 添加一条数据
// user1 := User{
// Name:"user1",
// Mobile:"1000000000",
// }
// result := db.Create(&user1)
// if result.Error != nil {
// fmt.Println("failed to create user: %v", result.Error)
// }
// fmt.Println(user1)
// 查询数据
var user User
// 主键查询
db.Find(&user,1)
var user2 User
// 条件查询
db.Find(&user2,"mobile = ?","1000000000")
fmt.Println(user)
fmt.Println(user2)
// 模拟动态条件
var wheres = make(map[string]interface{})
wheres["name"] = "test"
wheres["mobile"] = "111"
// wheres := map[string]interface{}{"name":"test","mobile":"1111",}
var user3 User
query := db.Model(&User{})
for key,value := range wheres{
if value != "" {
query = query.Where(fmt.Sprintf("%s = ?", key), value)
}
}
query.Find(&user3)
var upduser User
db.Find(&upduser,1)
// 更新某个字段
db.Model(&upduser).Update("mobile","123123")
// 更新多个字段
db.Model(&upduser).Updates(&User{Name:"aaaa",Mobile:"1000000000"})
// 删除
db.Delete(&upduser)
// 查询多条数据
var userlist []User
db.Where("id > ?",0).Find(&userlist)
fmt.Println(userlist)
for k,v := range userlist {
fmt.Println(k)
fmt.Println(v.Name)
}
var orderlist []User
// 分页及排序
db.Order("id desc").Limit(10).Offset(0).Find(&orderlist)
fmt.Println(orderlist)
// 事务操作
err = db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&User{Name: "User1",Mobile:"1700000111"}).Error; err != nil {
return err
}
if err := tx.Create(&User{Name: "User2",Mobile:"160000"}).Error; err != nil {
return err
}
return nil
})
if err != nil {
fmt.Println("出现事务错误")
fmt.Println(err)
}
pageFind(db)
// 关闭连接
mysqldb,err := db.DB()
mysqldb.Close()
}
// 分页查询,处理总数量、总页数
func pageFind(db *gorm.DB){
fmt.Println("进入分页方法查询")
var totalCount int64
query := db.Model(&User{}).Where("id > 0")
// 查询总数量
query.Count(&totalCount)
// 查询当前页数据
var list []User
pageSize := 2
currentPage := 0
db.Limit(pageSize).Offset(currentPage).Find(&list)
// 计算总页数
totalPages := (totalCount + int64(pageSize) - 1) / int64(pageSize)
fmt.Println("分页查询完毕")
fmt.Println(list)
fmt.Println("总数量",totalCount,"总页数",totalPages)
}
Golang gorm包 Golang
package main
// gorm 官方文档
// https://gorm.io/zh_CN/docs/
// 安装gorm
// go get -u gorm.io/gorm
// go get -u gorm.io/driver/mysql
// 如果因网络问题无法安装,尝试更换网络源
// 设置清华大学源
// go env -w GOPROXY=https://goproxy.cn,direct
// 初始化数据库连接
// import (
// "gorm.io/driver/mysql"
// "gorm.io/gorm"
// "log"
// )
// func main() {
// dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// if err != nil {
// log.Fatalf("failed to connect database: %v", err)
// }
// log.Println("Database connected successfully!")
// }
// dsn:数据源名称,需要替换 user、password 和 dbname。
// gorm.Config{}:GORM 的配置选项。
// 定义模型
// 定义与数据库表对应的模型
// type User struct {
// ID uint `gorm:"primaryKey"`
// Name string `gorm:"size:100"`
// Email string `gorm:"uniqueIndex;size:100"`
// CreatedAt time.Time
// UpdatedAt time.Time
// DeletedAt gorm.DeletedAt `gorm:"index"`
// }
// 迁移表结构
// 使用 GORM 的自动迁移功能创建表
// err = db.AutoMigrate(&User{})
// if err != nil {
// log.Fatalf("failed to migrate database: %v", err)
// }
// log.Println("Database migrated successfully!")
// 基本操作
// 1.创建数据
// user := User{Name: "John Doe", Email: "john.doe@example.com"}
// result := db.Create(&user)
// if result.Error != nil {
// log.Fatalf("failed to create user: %v", result.Error)
// }
// log.Printf("User created successfully: %+v", user)
// 2.查询记录
// var user User
// db.First(&user, 1) // 根据主键查询
// db.First(&user, "email = ?", "john.doe@example.com") // 条件查询
// log.Printf("User found: %+v", user)
// 3.更新记录
// db.Model(&user).Update("Name", "Jane Doe")
// db.Model(&user).Updates(User{Name: "Jane Doe", Email: "jane.doe@example.com"}) // 批量更新
// 4.删除记录
// db.Delete(&user) // 根据主键删除
// 高级功能
// 1.查询多条数据
// var users []User
// db.Where("name LIKE ?", "%Doe%").Find(&users)
// log.Printf("Users found: %+v", users)
// 2.分页和排序
// var users []User
// db.Order("created_at desc").Limit(10).Offset(0).Find(&users) // 分页
// 3.事务支持
// err = db.Transaction(func(tx *gorm.DB) error {
// if err := tx.Create(&User{Name: "User1"}).Error; err != nil {
// return err
// }
// if err := tx.Create(&User{Name: "User2"}).Error; err != nil {
// return err
// }
// return nil
// })
// if err != nil {
// log.Fatalf("Transaction failed: %v", err)
// }
// 常用配置
// 在初始化时配置 GORM 的行为
// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
// Logger: logger.Default.LogMode(logger.Info), // 显示详细的 SQL 日志
// })
// 字段级权限控制
// type User struct {
// Name string `gorm:"<-:create"` // 允许读和创建
// Name string `gorm:"<-:update"` // 允许读和更新
// Name string `gorm:"<-"` // 允许读和写(创建和更新)
// Name string `gorm:"<-:false"` // 允许读,禁止写
// Name string `gorm:"->"` // 只读(除非有自定义配置,否则禁止写)
// Name string `gorm:"->;<-:create"` // 允许读和写
// Name string `gorm:"->:false;<-:create"` // 仅创建(禁止从 db 读)
// Name string `gorm:"-"` // 通过 struct 读写会忽略该字段
// Name string `gorm:"-:all"` // 通过 struct 读写、迁移会忽略该字段
// Name string `gorm:"-:migration"` // 通过 struct 迁移会忽略该字段
// }
// 创建/更新时间追踪(纳秒、毫秒、秒、Time)
// GORM 约定使用 CreatedAt、UpdatedAt 追踪创建/更新时间。如果您定义了这种字段,GORM 在创建、更新时会自动填充 当前时间
// 要使用不同名称的字段,您可以配置 autoCreateTime、autoUpdateTime 标签。
// 如果您想要保存 UNIX(毫/纳)秒时间戳,而不是 time,您只需简单地将 time.Time 修改为 int 即可
// type User struct {
// CreatedAt time.Time // 在创建时,如果该字段值为零值,则使用当前时间填充
// UpdatedAt int // 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充
// Updated int64 `gorm:"autoUpdateTime:nano"` // 使用时间戳纳秒数填充更新时间
// Updated int64 `gorm:"autoUpdateTime:milli"` // 使用时间戳毫秒数填充更新时间
// Created int64 `gorm:"autoCreateTime"` // 使用时间戳秒数填充创建时间
// }
//字段标签
// column 指定 db 列名
// type 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null、size, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT
// serializer 指定将数据序列化或反序列化到数据库中的序列化器, 例如: serializer:json/gob/unixtime
// size 定义列数据类型的大小或长度,例如 size: 256
// primaryKey 将列定义为主键
// unique 将列定义为唯一键
// default 定义列的默认值
// precision 指定列的精度
// scale 指定列大小
// not null 指定列为 NOT NULL
// autoIncrement 指定列为自动增长
// autoIncrementIncrement 自动步长,控制连续记录之间的间隔
// embedded 嵌套字段
// embeddedPrefix 嵌入字段的列名前缀
// autoCreateTime 创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano
// autoUpdateTime 创建/更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli
// index 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情
// uniqueIndex 与 index 相同,但创建的是唯一索引
// check 创建检查约束,例如 check:age > 13,查看 约束 获取详情
// <- 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限
// -> 设置字段读的权限,->:false 无读权限
// - 忽略该字段,- 表示无读写,-:migration 表示无迁移权限,-:all 表示无读写迁移权限
// comment 迁移时为字段添加注释
// 配置表前缀
// dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
// NamingStrategy: schema.NamingStrategy{
// TablePrefix: "prefix_", // 设置表前缀
// SingularTable: true, // 禁用表名复数
// },
// Logger: logger.Default.LogMode(logger.Info),
// })
// TablePrefix:设置表前缀,例如 prefix_。
// SingularTable:
// 默认情况下,GORM 会将模型名转换为复数形式(如 User -> users)。
// 设置为 true 后,表名将保持单数形式。
// 自定义表名
// 对某个模型单独设置表名,可以实现 TableName 方法
// type User struct {
// ID uint
// Name string
// }
// func (User) TableName() string {
// return "custom_user_table"
// }
// 其他常见配置
// sqlDB, _ := db.DB()
// sqlDB.SetMaxIdleConns(10) // 设置空闲连接数
// sqlDB.SetMaxOpenConns(100) // 设置最大连接数
// sqlDB.SetConnMaxLifetime(time.Hour) // 设置连接的最大生命周期
// 配置日志输出
// 可以定制 GORM 的日志行为,例如输出到文件
// file, _ := os.Create("gorm.log")
// newLogger := logger.New(
// log.New(file, "\r\n", log.LstdFlags),
// logger.Config{
// SlowThreshold: time.Second, // 慢查询阈值
// LogLevel: logger.Warn, // 日志级别
// IgnoreRecordNotFoundError: true,
// },
// )
// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
// Logger: newLogger,
// })
// 完整配置总结
// dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
// SkipDefaultTransaction: true, // 跳过默认事务
// NamingStrategy: schema.NamingStrategy{
// TablePrefix: "prefix_", // 设置表前缀
// SingularTable: true, // 禁用表名复数
// },
// Logger: logger.Default.LogMode(logger.Info), // 显示详细日志
// })
// if err != nil {
// log.Fatalf("failed to connect database: %v", err)
// }
// // 配置连接池
// sqlDB, _ := db.DB()
// sqlDB.SetMaxIdleConns(10)
// sqlDB.SetMaxOpenConns(100)
// sqlDB.SetConnMaxLifetime(time.Hour)
// log.Println("Database connected successfully!")
func main(){
}
Golang mod 包管理 Golang
package main
// Go Modules 是 Go 的官方包管理工具,用于管理项目依赖和版本
// 检查当前模块状态
// go env GO111MODULE
// 如果输出是 auto 或 on,则已启用
// 初始化项目
// go mod init <module-name>
// 添加依赖
// 当你在代码中导入外部包时,运行以下命令自动下载依赖并更新 go.mod 和 go.sum
// go mod tidy
// 例如,在代码中添加以下依赖:
import "github.com/gin-gonic/gin"
// 然后运行
// go mod tidy
// 更新依赖
// 运行以下命令查看项目的所有依赖及其版本
// go list -m all
// 更新依赖到最新版本
// go get -u <package>
// 更新到特定版本
// go get <package>@<version>
// 例如
// go get github.com/gin-gonic/gin@v1.8.1
// 移除无用依赖
// go mod tidy
//此命令会移除未使用的依赖,并更新 go.mod 和 go.sum
// 下载依赖
// 只下载项目的所有依赖而不运行代码
// go mod download
// 验证依赖
// 验证项目的所有依赖是否正确(哈希值与 go.sum 一致)
// go mod verify
// 常用命令汇总
// go mod init <module> 初始化 Go Modules 项目
// go mod tidy 清理未使用的依赖,添加缺失的依赖
// go mod download 下载依赖到本地
// go mod verify 验证依赖是否正确
// go list -m all 查看所有依赖
// go get <package>@<version> 安装或更新特定版本的依赖
// go mod graph 查看依赖图
// go.mod 文件结构
// module: 项目名称。
// go: 使用的 Go 版本。
// require: 项目的依赖及其版本。
// replace: 替换依赖版本或路径。