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/sqlchứ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
sqlvớ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.