데이터를 반환하지 않는 SQL 문 실행
데이터를 반환하지 않는 SQL 문 실행 (Executing SQL statements that don't return data)
데이터를 반환하지 않는 데이터베이스 작업을 수행할 때는 database/sql 패키지의 Exec 또는 ExecContext 메서드를 사용해요. 이런 방식으로 실행하는 SQL 문에는 INSERT, DELETE, UPDATE가 대표적입니다. 반대로 행을 반환할 수 있는 쿼리라면 Query나 QueryContext 메서드를 써야 하고요 — 자세한 내용은 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.Exec은 sql.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 |