10. tháng 4 2025
Khi làm việc với thư viện ORM Gorm của Golang, tôi luôn cảm thấy như mình đang khám phá những điều bất ngờ. Chính vì thế mà nhiều lúc tôi tự hỏi tại sao mình không chuyển sang sử dụng Entity Framework Core của ASP.NET sớm hơn. Thật sự thì Gorm đôi khi trông giống như một phiên bản "học theo" thay vì là một giải pháp hoàn chỉnh.
Hôm nay, khi thực hiện truy vấn để lấy một bản ghi duy nhất từ cơ sở dữ liệu SQL Server, tôi lại gặp phải một lỗi kỳ lạ:
sqlserver: Sử dụng tùy chọn NEXT trong câu lệnh FETCH không hợp lệ. Lỗi này trong tiếng Anh được mô tả như sau: sqlserver: Invalid usage of the option NEXT in the FETCH statement.
Phiên bản SQL Server mà tôi đang sử dụng là 11.0.2100, tương ứng với SQL Server 2012.
Dưới đây là đoạn mã Go đã báo lỗi:
1var site models.Site
2err := models.MSDB.Where("`id` = ?", [soi keo hom nay](/blog/custom-components-in-the-backpack-list-page-edit-field/) id).First(&site).Error
Câu lệnh SQL tương ứng được tạo ra bởi Gorm như sau:
1SELECT * FROM "site" WHERE `id` = 167845 ORDER BY "site"."ID" OFFSET 0 ROW FETCH NEXT 1 ROWS ONLY
Sau khi tìm hiểu trên mạng, tôi phát hiện rằng các phiên tỷ số bóng đá hôm nay bản SQL Server cũ hơn không hỗ trợ cú pháp FETCH NEXT
. Đồng thời, Gorm cũng không cung cấp tính năng tương thích cho những phiên bản thấp này.
Thay vì sử dụng phương thức First
, chúng ta có thể sử dụng phương thức Find
như sau:
1err := models.MSDB.Find(&site, id).Error
Việc thay đổi này giúp tránh được việc Gorm sinh ra câu lệnh SQL sử dụng FETCH NEXT
, nhờ đó đảm bảo tương thích tốt hơn với các phiên bản cũ của SQL Server.