orm.io/gorm/logger和github.com/jinzhu/gorm版本有什么区别

gorm.io/gorm/logger 和 github.com/jinzhu/gorm 的 logger 主要有以下区别:

1. 版本区别

  • github.com/jinzhu/gorm 是 GORM v1(旧版)

  • gorm.io/gorm 是 GORM v2(新版)

2. Logger 接口变化

GORM v1 (github.com/jinzhu/gorm)
  • 使用 gorm.Logger 接口,较简单:

    go

    复制

    下载

    type Logger interface {
        Print(v ...interface{})
    }
  • 示例:

    go

    复制

    下载

    db.LogMode(true)
    db.SetLogger(log.New(os.Stdout, "\r\n", 0))
GORM v2 (gorm.io/gorm)
  • 使用更复杂的 logger.Interface

    go

    复制

    下载

    type Interface interface {
        LogMode(LogLevel) Interface
        Info(context.Context, string, ...interface{})
        Warn(context.Context, string, ...interface{})
        Error(context.Context, string, ...interface{})
        Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error)
    }
  • 支持 日志级别InfoWarnError

  • 支持 慢查询日志SlowThreshold

  • 支持 上下文(Context)

  • 示例:

    go

    复制

    下载

    newLogger := logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags),
        logger.Config{
            SlowThreshold: time.Second,
            LogLevel:      logger.Info,
            Colorful:      true,
        },
    )
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
        Logger: newLogger,
    })

3. 主要改进(GORM v2)

特性GORM v1 (github.com/jinzhu/gorm)GORM v2 (gorm.io/gorm)
日志级别❌ 不支持✅ InfoWarnError
慢查询日志❌ 手动实现✅ SlowThreshold
上下文支持❌ 不支持✅ 支持 context.Context
彩色输出❌ 不支持✅ 支持
结构化日志❌ 简单 Print✅ 更详细的 Trace 方法

4. 迁移建议

  • 新项目建议使用 gorm.io/gorm(v2),功能更强大,维护更好。

  • 旧项目迁移

    • 如果只是简单日志,可以继续用 SetLogger

    • 如果需要高级功能(如慢查询、上下文),建议升级到 v2。

5. 示例对比

GORM v1(旧版)

go

复制

下载

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "log"
    "os"
)

func main() {
    db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 启用日志
    db.LogMode(true)
    db.SetLogger(log.New(os.Stdout, "\r\n", 0))

    // 查询示例
    var users []User
    db.Find(&users) // SQL 会打印到 stdout
}
GORM v2(新版)

go

复制

下载

import (
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
    "gorm.io/driver/mysql"
    "log"
    "os"
    "time"
)

func main() {
    newLogger := logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags),
        logger.Config{
            SlowThreshold: time.Second,
            LogLevel:      logger.Info,
            Colorful:      true,
        },
    )

    db, err := gorm.Open(mysql.Open("user:password@/dbname?charset=utf8&parseTime=True&loc=Local"), &gorm.Config{
        Logger: newLogger,
    })
    if err != nil {
        panic(err)
    }

    // 查询示例
    var users []User
    db.Find(&users) // SQL 会按日志级别打印
}

总结

  • github.com/jinzhu/gorm(v1):简单,但功能有限。

  • gorm.io/gorm(v2):更强大,支持日志级别、慢查询、上下文等。

如果你的项目还在用 v1,建议升级到 v2,以获得更好的日志控制和功能支持。

### Golang 的有趣项目或应用程序 #### 1. JWT ORM 集成的 DevOps 工具 一个基于 Go 编写的 DevOps 项目展示了如何集成 JSON Web Token (JWT) 认证机制与 GORM 数据库操作框架[^1]。该项目位于 GitHub 上,提供了完整的代码实现文档说明。开发者可以从中学习到如何构建安全的应用程序接口(API),并管理数据库交互。 ```go package main import ( "github.com/gin-gonic/gin" _ "github.com/jinzhu/gorm/dialects/sqlite" ) func main() { r := gin.Default() // 路由定义省略 r.Run(":8080") // 默认监听端口 } ``` 此项目的亮点在于其模块化的架构设计,便于扩展功能服务部署。 #### 2. 自动化工具 goimports `goimports` 是一款用于自动调整导入路径的命令行工具,能够帮助开发者简化繁琐的手工配置过程[^2]。它不仅优化了代码可读性一致性,还减少了因手动修改而引入错误的可能性。对于大规模团队协作尤其重要。 安装方法如下所示: ```bash go get golang.org/x/tools/cmd/goimports ``` 运行之后即可享受更整洁美观的源文件结构! #### 3. 日志管理系统 关于日志处理方面,Golang 提供了一个强大的内置 `log` 库来满足基本需求[^3]。然而,在实际生产环境中,则需要更加精细控制策略以减少资源消耗并提高效率[^4]。例如采用分级记录方式区分不同严重程度的消息;或者利用第三方解决方案如 Logrus 实现彩色输出等功能增强体验感。 以下是简单示例演示如何创建自定义 logger 对象: ```go logger := log.New(os.Stdout, "[APP]", log.Ldate|log.Ltime) defer func() { logger.Println("Application terminated.") }() ``` 通过合理规划日志体系可以帮助运维人员更快定位问题所在从而提升整体服务质量水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值