☰ Mục lục series
Tài liệu Go tiếng Việt
  1. Bắt đầu (Getting started)
    1. Tổng quan
    2. Tải về và cài đặt
    3. Bắt đầu với Go
    4. Quản lý các bản cài đặt Go
    5. Plugin trình soạn thảo và IDE
  2. Dạo quanh Go (A Tour of Go)
    1. Chào mừng
    2. Package, biến và hàm
    3. Điều khiển luồng
    4. Struct, slice và map
    5. Method và interface
    6. Generics
    7. Xử lý đồng thời
  3. Hướng dẫn (Tutorials)
    1. Danh sách hướng dẫn
    2. Tạo một Go module
    3. Gọi mã của bạn từ một module khác
    4. Trả về và xử lý lỗi
    5. Trả về lời chào ngẫu nhiên
    6. Trả về lời chào cho nhiều người
    7. Thêm một test
    8. Biên dịch và cài đặt ứng dụng
    9. Kết luận
    10. Bắt đầu với workspace nhiều module
    11. Phát triển RESTful API với Go và Gin
    12. Truy cập cơ sở dữ liệu quan hệ
    13. Bắt đầu với generics
    14. Bắt đầu với fuzzing
    15. Làm việc với JSON
    16. Tìm và sửa các dependency có lỗ hổng với govulncheck
    17. Tìm và khắc phục phụ thuộc có lỗ hổng với VS Code Go
    18. Viết ứng dụng web
  4. Viết code Go
    1. Cách viết mã Go
    2. Effective Go
    3. Doc Comment trong Go
  5. Module
    1. Phát triển và publish module
    2. Quản lý phụ thuộc
    3. Tổ chức một module Go
    4. Quản lý mã nguồn của module
    5. Cách đánh số phiên bản module
    6. Quy trình phát hành và đánh phiên bản module
    7. Publish một module
    8. Phát triển một bản cập nhật major version
    9. Tham chiếu tệp go.mod
    10. Ngừng hỗ trợ 'go get' cho việc cài đặt tệp thực thi
  6. Cơ sở dữ liệu (Database)
    1. Truy cập cơ sở dữ liệu quan hệ
    2. Mở một handle cơ sở dữ liệu
    3. Thực thi câu lệnh SQL không trả về dữ liệu
    4. Truy vấn dữ liệu
    5. Dùng prepared statement
    6. Thực thi transaction
    7. Huỷ các thao tác đang chạy
    8. Quản lý kết nối
    9. Tránh rủi ro SQL injection
  7. Chẩn đoán và hiệu năng
    1. Chẩn đoán
    2. Hướng dẫn về Go Garbage Collector
    3. Tối ưu hoá dựa trên profile
    4. Data Race Detector
    5. Gỡ lỗi mã Go bằng GDB
    6. Hỗ trợ coverage profiling cho integration test
  8. Bảo mật (Security)
    1. Tổng quan bảo mật
    2. Thực hành tốt về bảo mật cho lập trình viên Go
    3. Quản lý lỗ hổng trong Go
    4. Cơ sở dữ liệu lỗ hổng của Go
    5. Quét lỗ hổng trong IDE
    6. Chính sách CNA của Go
    7. Go Fuzzing
    8. Chi tiết kỹ thuật của Go Fuzzing
    9. Chính sách bảo mật của Go
    10. Threat Model của Go
    11. Các quyết định về bảo mật của Go
    12. Tuân thủ FIPS 140-3
  9. Công cụ và toolchain
    1. Tài liệu về các lệnh
    2. Về lệnh go
    3. Go Toolchains
    4. Telemetry của Go
    5. Cài đặt Go từ mã nguồn
    6. Cài đặt và sử dụng gccgo
  10. Tham khảo
    1. Câu hỏi thường gặp (FAQ)
    2. Go 1 và tương lai của các chương trình Go
    3. Hướng dẫn chuyển đổi sang encoding/json/v2
    4. Hướng dẫn đóng góp
    5. Đóng góp cho frontend gccgo
  11. Phụ lục
    1. Bảng thuật ngữ
Cơ sở dữ liệu (Database)

Thực thi câu lệnh SQL không trả về dữ liệu

Bản dịch từ go.dev/doc/database/change-data

Khi bạn thực hiện những thao tác cơ sở dữ liệu không trả về dữ liệu, hãy dùng method Exec hoặc ExecContext của package database/sql. Các câu lệnh SQL mà bạn thực thi theo cách này gồm INSERT, DELETE, và UPDATE.

Khi truy vấn của bạn có thể trả về các row, hãy dùng method Query hoặc QueryContext thay cho chúng. Tìm hiểu thêm tại Truy vấn cơ sở dữ liệu.

Method ExecContext hoạt động như method Exec, nhưng có thêm một đối số context.Context, như mô tả trong Huỷ các thao tác đang chạy.

Mã trong ví dụ dưới đây dùng DB.Exec để thực thi một câu lệnh thêm một bản ghi album mới vào bảng album.

func AddAlbum(alb Album) (int64, error) {
	result, err := db.Exec("INSERT INTO album (title, artist) VALUES (?, ?)", alb.Title, alb.Artist)
	if err != nil {
		return 0, fmt.Errorf("AddAlbum: %v", err)
	}

	// Get the new album's generated ID for the client.
	id, err := result.LastInsertId()
	if err != nil {
		return 0, fmt.Errorf("AddAlbum: %v", err)
	}
	// Return the new album's ID.
	return id, nil
}

DB.Exec trả về các giá trị: một sql.Result và một lỗi. Khi lỗi là nil, bạn có thể dùng Result để lấy ID của mục vừa được chèn vào sau cùng (như trong ví dụ) hoặc để lấy số row bị thao tác đó tác động.

Lưu ý: Ký hiệu chỗ dành cho tham số trong prepared statement khác nhau tuỳ theo DBMS và driver bạn đang dùng. Ví dụ, driver pq cho Postgres yêu cầu ký hiệu placeholder kiểu $1 thay vì ?.

Nếu mã của bạn sẽ thực thi cùng một câu lệnh SQL nhiều lần, hãy cân nhắc dùng một sql.Stmt để tạo một prepared statement tái sử dụng được từ câu lệnh SQL đó. Tìm hiểu thêm tại Dùng prepared statement.

Thận trọng: Đừng dùng các hàm định dạng chuỗi như fmt.Sprintf để ghép nên một câu lệnh SQL! Bạn có thể tạo ra nguy cơ SQL injection. Tìm hiểu thêm tại Tránh nguy cơ SQL injection.

Các hàm để thực thi câu lệnh SQL không trả về row

Hàm Mô tả
DB.Exec
DB.ExecContext
Thực thi độc lập một câu lệnh SQL đơn lẻ.
Tx.Exec
Tx.ExecContext
Thực thi một câu lệnh SQL bên trong một transaction lớn hơn. Tìm hiểu thêm tại Thực thi transaction.
Stmt.Exec
Stmt.ExecContext
Thực thi một câu lệnh SQL đã được chuẩn bị sẵn. Tìm hiểu thêm tại Dùng prepared statement.
Conn.ExecContext Dùng với các kết nối được giữ riêng. Tìm hiểu thêm tại Quản lý kết nối.

Nội dung gốc: Go Documentation © The Go Authors, giấy phép CC BY 3.0. Bản dịch và ghi chú: Lê Văn Dũng.