Table of Contents
Go Stdlib Wiki: package database/sql
1. Overview
database/sql provides a generic SQL database interface in Go. It does NOT talk to a database by itself. Instead, it works together with a database-specific driver (e.g., lib/pq for PostgreSQL, go-sql-driver/mysql for MySQL) that implements the low-level protocol.
generic /dʒəˈnerɪk/ = chung, tổng quát
driver /ˈdraɪvər/ = trình điều khiển (thư viện kết nối DB)
protocol /ˈproʊtəˌkɔːl/ = giao thức
import "database/sql"
2. What it is for
Use database/sql to:
Open/manage database connections via a driver
Run SQL queries (Query, QueryRow) and commands (Exec)
Use prepared statements (Prepare)
Control transactions (Begin, Commit, Rollback)
Configure connection pooling (max open/idle, lifetime)
transaction /trænˈzækʃən/ = giao dịch
prepared statement /prɪˈperd ˈsteɪtmənt/ = câu lệnh chuẩn bị sẵn
connection pool /kəˈnekʃən puːl/ = bể kết nối (tái sử dụng kết nối)
3. What it is NOT for
It does NOT provide an ORM (like GORM).
It does NOT include DB drivers.
It does NOT auto-migrate schemas.
If you need higher-level features, you use libraries on top of it.
ORM /ˌɔːrˈɛm/ = Object-Relational Mapping (ánh xạ object–bảng)
4. Core types (what is what)
4.1 *sql.DB
What it is: a handle representing a pool of connections, safe for concurrent use. Important: sql.Open does not necessarily connect immediately; use Ping() to verify.
concurrent /kənˈkɝːənt/ = đồng thời
handle /ˈhændl/ = “tay cầm”/đối tượng đại diện
4.2 *sql.Rows / *sql.Row
Rows for multiple-row results (Query)
Row for single-row results (QueryRow)
4.3 sql.Result
Returned from Exec, used to get:
LastInsertId() (if supported by driver)
RowsAffected()
4.4 *sql.Tx
Transaction handle created by Begin/BeginTx.
4.5 *sql.Stmt
Prepared statement created by Prepare (or db.PrepareContext).
5. Driver relationship (why you need pq etc.)
database/sql defines the common API. Drivers register themselves (via database/sql/driver) so database/sql can call them.
Typical usage pattern:
Import driver for its side effects (registration)
Use sql.Open(driverName, dsn)
Example (PostgreSQL driver github.com/lib/pq):
import ( "database/sql" _ "github.com/lib/pq" ) db, err := sql.Open("postgres", "postgres://user:pass@localhost:5432/dbname?sslmode=disable")
side effect /saɪd ɪˈfekt/ = tác dụng phụ (ở đây: tự đăng ký driver khi import)
DSN /ˌdiː es ˈɛn/ = Data Source Name (chuỗi cấu hình kết nối)
6. Common recipes
6.1 Open and verify connection
db, err := sql.Open("postgres", dsn) if err != nil { return err } defer db.Close() if err := db.Ping(); err != nil { return err }
6.2 Query multiple rows
rows, err := db.Query("SELECT id, name FROM users WHERE active = $1", true) if err != nil { return err } defer rows.Close() for rows.Next() { var id int64 var name string if err := rows.Scan(&id, &name); err != nil { return err } } if err := rows.Err(); err != nil { return err }
scan /skæn/ = quét/đổ dữ liệu từ row vào biến
6.3 Query a single row
var count int err := db.QueryRow("SELECT COUNT(*) FROM users").Scan(&count)
6.4 Exec (INSERT/UPDATE/DELETE)
res, err := db.Exec("UPDATE users SET active = $1 WHERE id = $2", true, 10) if err != nil { return err } n, _ := res.RowsAffected() _ = n
6.5 Transaction (Tx)
tx, err := db.Begin() if err != nil { return err } defer tx.Rollback() // safe: no-op if committed if _, err := tx.Exec("UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, 1); err != nil { return err } if _, err := tx.Exec("UPDATE accounts SET balance = balance + $1 WHERE id = $2", 100, 2); err != nil { return err } return tx.Commit()
7. Connection pool settings
Tuning (depends on workload/DB limits):
db.SetMaxOpenConns(n)
db.SetMaxIdleConns(n)
db.SetConnMaxLifetime(d)
db.SetConnMaxIdleTime(d)
tuning /ˈtuːnɪŋ/ = tinh chỉnh
workload /ˈwɝːkˌloʊd/ = tải công việc
8. Quick “what is what for” map
database/sql — standard, generic SQL API
DB driver (e.g., lib/pq) — actual DB protocol implementation
sql.Open — create *sql.DB (pool handle), not necessarily connect yet
db.Ping — verify connectivity
db.Query / db.QueryRow — SELECT
db.Exec — INSERT/UPDATE/DELETE
db.Begin / tx.Commit / tx.Rollback — transactions
db.SetMaxOpenConns etc. — pool configuration
