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:

  1. Viết SQL queries trong file .sql, kèm annotation để sqlc biết cách sinh code
  2. Chạy sqlc generate
  3. 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 sqlc vs GORM vs sqlx
sqlc đứng đầu về performance và type safety; GORM mạnh về developer experience và auto-migration

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ệnSimple QueryComplex JoinBulk InsertMemory
sqlcNhanh nhấtNhanh nhấtNhanh nhấtThấp nhất
sqlxNhanhNhanhNhanhThấp
GORMVừaChậm hơnVừaCao 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ũ.

via sqlc-dev/sqlc trên GitHub · Documentation · sqlc.dev