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("执行完成")

}

杨佳乐 发布于  2025-1-17 15:46 

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)
}

杨佳乐 发布于  2025-1-17 13:51 

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(){

}

杨佳乐 发布于  2025-1-17 10:49 

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: 替换依赖版本或路径。

杨佳乐 发布于  2025-1-16 10:24 

Golang 常用web框架推荐 Golang

Go 常见 Web 框架详解

Go 语言中有许多优秀的 Web 框架可供选择。以下是一些常见的 Web 框架的特点和适用场景。


Gin

简介

Gin 是一个轻量级、高性能的 Web 框架,设计简单但功能强大。它基于 net/http,但提供了更高的开发效率。

特点

  • 快速,路由性能优秀。
  • 支持中间件。
  • 提供简洁的 JSON 处理。
  • 丰富的社区支持和插件。

适用场景

适合快速开发 RESTful API 和中小型项目。


Echo

简介

Echo 是另一个轻量级、高性能的 Web 框架,与 Gin 类似,但提供了更多的功能和灵活性。

特点

  • 极简的 API。
  • 支持中间件和分组路由。
  • 支持模板渲染。
  • 内置数据验证和绑定功能。

适用场景

适合快速开发、需要灵活性的项目。


Fiber

简介

Fiber 是一个基于 fasthttp 的 Web 框架,设计灵感来源于 Node.js 的 Express 框架。

特点

  • 高性能,专为速度优化。
  • 易于上手,API 设计类似 Express。
  • 内置丰富的功能(如中间件、模板引擎等)。

适用场景

适合需要极致性能和熟悉 Express 的开发者。


Beego

简介

Beego 是一个全功能的 Web 框架,提供了 MVC 架构,适合构建大型 Web 应用。

特点

  • 内置 ORM、缓存、日志、任务调度等功能。
  • 支持 RESTful 风格的路由。
  • 提供自动化的 API 文档生成。

适用场景

适合构建企业级 Web 应用或需要一站式解决方案的项目。


Revel

简介

Revel 是一个全栈 Web 框架,提供了许多开箱即用的功能,适合快速开发完整的 Web 应用。

特点

  • 完整的 MVC 模式。
  • 提供代码热重载功能。
  • 支持表单验证和国际化。

适用场景

适合传统 MVC 风格的开发。


Chi

简介

Chi 是一个小巧但功能强大的路由器库,支持构建中间件链。

特点

  • 轻量级,零依赖。
  • 高度可扩展。
  • 支持上下文传递。

适用场景

适合需要简单但灵活的路由功能的项目。


对比总结

框架 性能 学习曲线 功能丰富性 社区支持 适用场景
Gin 中等 中小型项目,RESTful API
Echo 丰富 灵活性需求高的项目
Fiber 极高 丰富 性能敏感型项目
Beego 丰富(全栈) 企业级项目
Revel 丰富(全栈) 传统 MVC 项目
Chi 基础 轻量路由器需求

推荐选择

  1. 初学者:从 Gin 开始,了解基础概念和开发模式。
  2. 快速开发:Gin、Echo、Fiber 都是高效的选择。
  3. 全栈开发:选择 Beego 或 Revel。
  4. 高性能:Fiber 或 Chi。
  5. 企业项目:Beego 提供了全面的功能支持。

杨佳乐 发布于  2025-1-13 21:24