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

Khi thực hiện các thao tác cơ sở dữ liệu không trả về dữ liệu, hãy sử dụng phương thức Exec hoặc ExecContext từ gói database/sql. Các câu lệnh SQL bạn thực thi theo cách này bao gồm INSERT, DELETEUPDATE.

Khi truy vấn có thể trả về các hàng dữ liệu, hãy dùng phương thức Query hoặc QueryContext thay thế. Để tìm hiểu thêm, xem Truy vấn cơ sở dữ liệu.

Phương thức ExecContext hoạt động giống Exec nhưng nhận thêm tham số context.Context, như mô tả trong Hủy các thao tác đang thực hiện.

Đoạn mã trong ví dụ dưới đây sử dụng DB.Exec để thực thi một câu lệnh thêm 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ề hai giá trị: một sql.Result và một error. Khi error là nil, bạn có thể dùng Result để lấy ID của bản ghi vừa chèn (như trong ví dụ) hoặc để lấy số hàng bị ảnh hưởng bởi thao tác.

Lưu ý: Các placeholder tham số trong prepared statement thay đổi tùy theo DBMS và driver bạn đang dùng. Ví dụ, pq driver cho Postgres yêu cầu placeholder dạng $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 sql.Stmt để tạo một prepared statement có thể tái sử dụng từ câu lệnh SQL đó. Để tìm hiểu thêm, xem Sử dụng prepared statement.

Chú ý: Đừng dùng các hàm định dạng chuỗi như fmt.Sprintf để tạo câu lệnh SQL! Bạn có thể tạo ra nguy cơ SQL injection. Để tìm hiểu thêm, xem Tránh nguy cơ SQL injection.

Các hàm thực thi câu lệnh SQL không trả về hàng dữ liệu

Hàm Mô tả
DB.Exec
DB.ExecContext
Thực thi một câu lệnh SQL độc lập.
Tx.Exec
Tx.ExecContext
Thực thi một câu lệnh SQL trong phạm vi một transaction lớn hơn. Để tìm hiểu thêm, xem Thực thi transaction.
Stmt.Exec
Stmt.ExecContext
Thực thi một prepared statement đã được chuẩn bị trước. Để tìm hiểu thêm, xem Sử dụng prepared statement.
Conn.ExecContext Dùng với các kết nối dành riêng. Để tìm hiểu thêm, xem Quản lý kết nối.