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.ExecDB.ExecContext |
Thực thi độc lập một câu lệnh SQL đơn lẻ. |
Tx.ExecTx.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.ExecStmt.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. |