Đoạn mã gây ra vấn đề

Đoạn mã gây ra vấn đề

cổng game quốc tế,link i9bet nhận 100k,mu88 mu88 casino

Sau khi nâng cấp lên golang 1.23, hàm count của GORM luôn trả về 0

Ngày cập nhật: 15/11/2024 | Số lần xem: 523 | Số từ: 498 | Danh mục: golang


Trước đây để sử dụng một tính năng mới của thư viện excelize — đó là tự động phân tích màu chữ trong ô Excel — tôi đã tiến hành nâng cấp ngôn ngữ Go từ phiên bản 1.18 lên 1.23. Tuy nhiên, sau khi nâng cấp lại gặp phải một lỗi liên quan đến GORM, cụ thể là phương thức Count không hoạt động như mong đợi.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var items []models.Article
db := models.DB.Model(&models.Article{}).
    Preload("Category")
db = db.Session(&gorm.Session{})
db.Order("id desc").
    Limit(limit).
    Offset((page - 1) * limit).
    Find(&items)
var count int64 = 0
db.Count(&count)

Hiện tượng xảy ra

  • Hàm Count luôn trả về giá trị 0.
  • Trong log debug, chỉ xuất hiện câu truy vấn SQL tương ứng với Find, nhưng hoàn toàn không có lệnh SQL nào liên quan đến Count. Điều này cho thấy rằng hàm Count gần như bị bỏ qua.
  • Vấn đề này chỉ xuất hiện kể từ khi nâng cấp lên Go 1.23, trước đó khi dùng Go 1.18 thì mọi thứ vẫn chạy ổn định.

Dựa vào những biểu hiện trên, có vẻ như GORM đang gặp sự cố nào đó khi thực thi trên phiên bản Go mới hơn. Đặc biệt, GORM thường “lặng thin” khi gặp lỗi, không báo bất kỳ thông báo nào, dẫn đến việc chương trình tiếp tục thực thi và trả về giá trị mặc định là 0.

Thử nghiệm thêm

  • Nếu loại bỏ phần Preload("Category"), hàm Count sẽ hoạt động bình thường.
  • Ngược lại, khi giữ nguyên Preload, thì Count vẫn không được thực thi và trả về 0.

Thông tin phiên bản

1
2
3
4
5
6
> go version
go version go1.23.2 linux/amd64
> grep gorm go.mod
gorm.io/datatypes v1.0.6
gorm.io/driver/mysql v1.3.2
gorm.io/gorm v1.23.2

Cập nhật GORM lên phiên bản mới nhất

Tôi đã dành thời gian tìm kiếm trên Google và kiểm tra các issue trên GitHub của GORM, phát hiện ra rằng có người cũng gặp phải vấn đề tương tự, nhưng chưa có lời giải đáp chính thức. Vì vậy, tôi quyết định thử nâng cấp GORM lên phiên bản mới nhất để xem liệu lỗi có được khắc phục hay không:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
> go get -u gorm.io/gorm
go: downloading gorm.io/gorm v1.25.12
go: downloading golang.org/x/text v0.20.0
go: downloading golang.org/x/sys v0.5.0
go: downloading golang.org/x/sync v0.9.0
go: upgraded github.com/jinzhu/now v1.1.4 => v1.1.5
go: upgraded golang.org/x/sync v0.0.0-20201207232520-09787c993a3a => v0.9.0
go: upgraded golang.org/x/sys v0.0.0-20211020174200-9d6173849985 => v0.5.0
go: upgraded golang.org/x/text v0.3.7 => v0.20.0
go: upgraded gorm.io/gorm v1.23.2 => v1.25.12
  • Phiên bản v1.25.12 là phiên bản mới nhất (tính đến tháng 8 năm 2024).
  • Phiên bản cũ v1.23.2 được phát hành vào tháng 3 năm 2022.

Kết quả sau khi nâng cấp

Sau khi nâng cấp GORM lên phiên bản mới nhất, vấn đề đã được khắc phục hoàn toàn. Điều này cho thấy rằng việc nâng cấp ngôn ngữ lập trình không phải lúc nào cũng đảm bảo tính tương thích ngược tuyệt đối. Đặc biệt với các thư viện như GORM, cần phải kiểm tra kỹ càng trước khi triển khai lên môi trường sản phẩm.

Từ đây trở đi, tôi sẽ phải dành thời gian để cập nhật lại tất cả các dự án Go cũ còn dùng phiên bản GORM lỗi thời 😥

comments powered by Disqus
Built with Hugo
Theme Stack thiết kế bởi Jimmy