☰ 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)

Truy cập cơ sở dữ liệu quan hệ

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

Với Go, bạn có thể đưa rất nhiều loại cơ sở dữ liệu và nhiều cách tiếp cận dữ liệu khác nhau vào ứng dụng của mình. Các chủ đề trong phần này mô tả cách dùng package database/sql của thư viện chuẩn để truy cập cơ sở dữ liệu quan hệ.

Nếu muốn một bài hướng dẫn nhập môn về truy cập dữ liệu với Go, xem Hướng dẫn: Truy cập cơ sở dữ liệu quan hệ.

Go cũng hỗ trợ các công nghệ truy cập dữ liệu khác, bao gồm các thư viện ORM cho phép truy cập cơ sở dữ liệu quan hệ ở mức trừu tượng cao hơn, và cả các kho dữ liệu NoSQL phi quan hệ.

  • Thư viện ánh xạ đối tượng - quan hệ (ORM). Package database/sql chứa các hàm phục vụ logic truy cập dữ liệu ở mức thấp, nhưng bạn cũng có thể dùng Go để truy cập kho dữ liệu ở mức trừu tượng cao hơn. Tìm hiểu thêm về hai thư viện ORM phổ biến cho Go tại GORM (tham chiếu package) và ent (tham chiếu package).
  • Kho dữ liệu NoSQL. Cộng đồng Go đã phát triển driver cho phần lớn các kho dữ liệu NoSQL, trong đó có MongoDB và Couchbase. Bạn có thể tìm thêm trên pkg.go.dev.

Các hệ quản trị cơ sở dữ liệu được hỗ trợ

Go hỗ trợ toàn bộ những hệ quản trị cơ sở dữ liệu quan hệ thông dụng nhất, bao gồm MySQL, Oracle, Postgres, SQL Server, SQLite, và nhiều hệ khác.

Bạn sẽ tìm thấy danh sách driver đầy đủ tại trang SQLDrivers.

Các hàm để thực thi truy vấn hoặc thay đổi cơ sở dữ liệu

Package database/sql có những hàm được thiết kế riêng cho từng loại thao tác cơ sở dữ liệu mà bạn đang thực hiện. Ví dụ, tuy bạn có thể dùng Query hoặc QueryRow để thực thi truy vấn, QueryRow được thiết kế cho trường hợp bạn chỉ mong nhận về một dòng duy nhất, nhờ đó bỏ được chi phí trả về một sql.Rows chỉ chứa đúng một dòng. Bạn có thể dùng hàm Exec để thay đổi cơ sở dữ liệu bằng các câu lệnh SQL như INSERT, UPDATE hay DELETE.

Tìm hiểu thêm tại:

Transaction

Thông qua sql.Tx, bạn có thể viết mã thực thi các thao tác cơ sở dữ liệu trong một transaction. Trong một transaction, nhiều thao tác có thể được thực hiện cùng nhau và kết thúc bằng một lần commit cuối cùng để áp dụng toàn bộ thay đổi trong một bước nguyên tử, hoặc bằng một lần rollback để huỷ bỏ chúng.

Tìm hiểu thêm về transaction tại Thực thi transaction.

Huỷ truy vấn

Bạn có thể dùng context.Context khi muốn có khả năng huỷ một thao tác cơ sở dữ liệu, chẳng hạn khi kết nối của client bị đóng hoặc khi thao tác chạy lâu hơn mức bạn mong muốn.

Với bất kỳ thao tác cơ sở dữ liệu nào, bạn đều có thể dùng một hàm của package database/sql nhận Context làm đối số. Thông qua Context, bạn có thể chỉ định thời gian chờ tối đa hoặc hạn chót cho thao tác. Bạn cũng có thể dùng Context để lan truyền yêu cầu huỷ xuyên suốt ứng dụng của mình, tới tận hàm đang thực thi câu lệnh SQL, nhờ đó bảo đảm tài nguyên được giải phóng nếu chúng không còn cần đến nữa.

Tìm hiểu thêm tại Huỷ các thao tác đang chạy.

Connection pool được quản lý sẵn

Khi dùng handle cơ sở dữ liệu sql.DB, bạn đang kết nối thông qua một connection pool có sẵn, nó tự tạo và huỷ các kết nối theo nhu cầu mã của bạn. Dùng handle qua sql.DB là cách truy cập cơ sở dữ liệu thông dụng nhất trong Go. Tìm hiểu thêm tại Mở một handle cơ sở dữ liệu.

Package database/sql quản lý connection pool giúp bạn. Tuy nhiên, với những nhu cầu nâng cao hơn, bạn có thể thiết lập các thuộc tính của connection pool như mô tả trong Thiết lập thuộc tính connection pool.

Với những thao tác cần một kết nối riêng được giữ lại, package database/sql cung cấp sql.Conn. Conn đặc biệt hữu ích khi dùng transaction bằng sql.Tx là lựa chọn không phù hợp.

Ví dụ, mã của bạn có thể cần:

  • Thay đổi schema thông qua DDL, bao gồm cả logic vốn đã chứa ngữ nghĩa transaction của riêng nó. Trộn lẫn các hàm transaction của package sql với câu lệnh transaction SQL là một thực hành không tốt, như mô tả trong Thực thi transaction.
  • Thực hiện các thao tác khoá truy vấn có tạo ra bảng tạm.

Tìm hiểu thêm tại Dùng kết nối riêng.

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.