- sqlc biên dịch SQL thành Go code type-safe hoàn chỉnh - nhanh hơn GORM trên complex join, zero reflection overhead, 17.6k GitHub stars.
- MIT license, miễn phí hoàn toàn.
- Phiên bản v1.31.1 hỗ trợ Go, Kotlin, Python, TypeScript và hàng chục ngôn ngữ khác qua plugin.
TL;DR
sqlc là một công cụ sinh code - bạn viết SQL, nó sinh ra Go code type-safe hoàn chỉnh. Không ORM, không reflection, không magic. Peter Steinberger (tác giả PSPDFKit) vừa gọi nó là "pretty sweet" và không khó hiểu tại sao: với 17.6k GitHub stars, 249 contributors, và benchmark nhanh nhất trong nhóm (sqlc vs GORM vs sqlx), sqlc đang được nhiều team Go production tin dùng.
Vấn đề với ORM truyền thống
Khi viết Go với database, bạn thường phải chọn một trong hai hướng:
- ORM đầy đủ (GORM): nhanh lúc prototyping, nhưng khi query phức tạp thì GORM sinh SQL khó đoán, N+1 problem rình rập, và lỗi type mismatch chỉ lộ ra lúc runtime.
- Raw SQL + database/sql: kiểm soát hoàn toàn nhưng code boilerplate rất nhiều - manual row scanning, repetitive error handling, struct mapping tay.
sqlx giải quyết một phần vấn đề boilerplate nhưng vẫn không validate SQL lúc compile-time. Typo trong tên column chỉ crash lúc chạy thật.
sqlc giải quyết cả hai: bạn viết raw SQL, nó sinh ra Go code type-safe - lỗi SQL bị bắt ngay lúc sqlc generate, không phải lúc production down.
sqlc hoạt động ra sao
Flow chỉ có 3 bước:
- Viết SQL queries trong file
.sql, kèm annotation để sqlc biết cách sinh code - Chạy
sqlc generate - Dùng các function được sinh ra trong application code
Ví dụ, một query annotation đơn giản:
-- name: GetUser :one
SELECT id, name, email FROM users WHERE id = $1;
sqlc sẽ sinh ra function Go:
func (q *Queries) GetUser(ctx context.Context, id int64) (User, error)
Các annotation types:
:one- trả về 1 row:many- trả về slice:exec- execute, không return data:execrows- execute và return số rows affected
Vì sqlc parse SQL statically, nó biết chính xác type của mọi column - không cần runtime reflection, không có overhead.
Tính năng đáng chú ý
sqlc verify: Khi schema thay đổi, verify kiểm tra xem các query đang chạy production có bị break không. Tính năng này phân tích existing queries trước khi migration được apply - cực kỳ giá trị cho team muốn zero-downtime deploy.
sqlc vet: Lint queries qua CEL rules, kết nối live database để chạy EXPLAIN, phát hiện query không dùng index hoặc query sẽ fail khi prepare.
Hỗ trợ đa ngôn ngữ: Ngoài Go, sqlc còn sinh code cho Kotlin, Python, TypeScript. Community plugins mở rộng thêm C#, Ruby, Zig, Java, PHP.
Zero CGO từ v1.25.0: Trước đây sqlc phụ thuộc 3 thư viện CGO khác nhau. Từ v1.25.0, toàn bộ được thay bằng pure Go - Windows users lần đầu có full PostgreSQL support mà không cần WSL.
So sánh trực tiếp: sqlc vs GORM vs sqlx
Benchmark thực tế cho thấy sqlc là nhanh nhất cho cả simple query, complex join và bulk insert, đồng thời có memory overhead thấp nhất:
| Thư viện | Simple Query | Complex Join | Bulk Insert | Memory |
|---|---|---|---|---|
| sqlc | Nhanh nhất | Nhanh nhất | Nhanh nhất | Thấp nhất |
| sqlx | Nhanh | Nhanh | Nhanh | Thấp |
| GORM | Vừa | Chậm hơn | Vừa | Cao hơn |
Lưu ý: GORM chậm hơn ~2x trên complex join do reflection overhead. Với hầu hết ứng dụng, chênh lệch này không đáng kể - nhưng ở high scale hoặc trong hot paths, nó rất đáng xem xét.
GORM phù hợp hơn khi: prototyping nhanh, CRUD-heavy app, team nhiều người chưa mạnh SQL, cần association handling và soft delete out-of-box.
sqlx phù hợp hơn khi: muốn control cao, tránh ORM magic, team đã quen SQL, nhưng không muốn overhead của code generation.
Hạn chế cần biết
- Cần chạy code generation mỗi lần sửa SQL - thêm một bước vào workflow, cần tích hợp vào CI/CD
- Dynamic queries khó xử lý - sqlc phân tích SQL tĩnh, query build động phải xử lý manual
- Không có migration tích hợp - cần dùng thêm golang-migrate, goose, hoặc Atlas
- Cần SQL proficiency - không có ORM abstraction để dựa vào, team phải hiểu joins, indexes, query planning
Nên dùng khi nào
sqlc phù hợp nhất cho:
- Microservices với bounded database interaction - mỗi service query tập trung, explicit
- Applications cần performance cao hoặc muốn dùng advanced PostgreSQL features (JSONB, arrays, pgvector)
- Team coi trọng code review quality - SQL thay đổi visible trong PR diff thay vì ẩn trong ORM method chains
- Apps đang outgrow GORM - migration path phổ biến: identify bottleneck queries → rewrite với sqlc
Bắt đầu ngay
Install đơn giản:
# Homebrew
brew install sqlc
# Go toolchain
go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest
sqlc hoàn toàn miễn phí, MIT license. Latest stable: v1.31.1 (released 2026-04-22). 17.6k GitHub stars, 249 contributors, active development.
Nếu bạn đang viết Go và tương tác với database - ít nhất một lần hãy thử sqlc trên một service nhỏ. Rất có thể bạn sẽ không muốn quay lại cách cũ.
