데이터를 반환하지 않는 SQL 문 실행

데이터를 반환하지 않는 SQL 문 실행 (Executing SQL statements that don't return data)

데이터를 반환하지 않는 데이터베이스 작업을 수행할 때는 database/sql 패키지의 Exec 또는 ExecContext 메서드를 사용해요. 이런 방식으로 실행하는 SQL 문에는 INSERT, DELETE, UPDATE가 대표적입니다. 반대로 행을 반환할 수 있는 쿼리라면 QueryQueryContext 메서드를 써야 하고요 — 자세한 내용은 Querying a database 문서를 참고하세요.

ExecContext 메서드는 Exec처럼 동작하되 context.Context 인자를 하나 더 받습니다. 이 인자로 작업 취소를 다루는 내용은 Canceling in-progress operations 문서에 설명되어 있어요.

출처: Go 공식 문서

다음 예시의 코드는 DB.Exec을 사용해 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.Execsql.Result와 error 두 값을 돌려줍니다. error가 nil이면 Result로 마지막으로 삽입한 항목의 ID를 얻거나(예시처럼), 작업이 영향을 준 행 수를 알아낼 수 있어요.

참고: 프리페어드 스테이트먼트의 파라미터 플레이스홀더는 DBMS와 사용하는 드라이버에 따라 달라집니다. 예를 들어 Postgres용 pq 드라이버는 ? 대신 $1 같은 플레이스홀더를 요구해요.

만약 같은 SQL 문을 반복해서 실행할 코드라면, sql.Stmt를 사용해 그 SQL 문에서 재사용 가능한 프리페어드 스테이트먼트를 만들어 두는 걸 고려해 볼 만해요. 자세한 내용은 Using prepared statements 문서를 확인하세요.

주의: fmt.Sprintf 같은 문자열 포매팅 함수로 SQL 문을 조립하지 마세요! SQL 인젝션 위험이 생길 수 있습니다. 자세한 내용은 Avoiding SQL injection risk 문서를 참고하세요.

데이터를 반환하지 않는 SQL 문을 실행하는 함수

함수 설명
DB.Exec DB.ExecContext 단일 SQL 문을 독립적으로 실행한다.
Tx.Exec Tx.ExecContext 더 큰 트랜잭션 안에서 SQL 문을 실행한다. 자세히: Executing transactions
Stmt.Exec Stmt.ExecContext 이미 프리페어드된 SQL 문을 실행한다. 자세히: Using prepared statements
Conn.ExecContext 예약된 커넥션 전용으로 쓴다. 자세히: Managing connections

더 알아보기 (Learn more)