MySql 사용 - DML

1. MySql 삽입,갱신,삭제

데이타를 INSERT, UPDATE, DELETE (DML Operation)하기 위해서 sql.DB 객체의 Exec() 메서드를 사용한다. Query/QueryRow 메서드는 데이타를 리턴할 때 사용하는 반면, DML과 같이 리턴되는 데이타가 없는 경우는 Exec 메서드를 사용해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main
 
import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/go-sql-driver/mysql"
)
 
func main() {
    // sql.DB 객체 생성
    db, err := sql.Open("mysql", "root:pwd@tcp(127.0.0.1:3306)/testdb")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
 
    // INSERT 문 실행
    result, err := db.Exec("INSERT INTO test1 VALUES (?, ?)", 11, "Jack")
    if err != nil {
        log.Fatal(err)
    }
 
    // sql.Result.RowsAffected() 체크
    n, err := result.RowsAffected()
    if n == 1 {
        fmt.Println("1 row inserted.")
    }
}

Exec 메서드의 첫번째 파라미터에는 SQL문을 적고, 그 SQL문 안에 ? 이 있는 경우 계속해서 상응하는 파라미터를 넣어 준다. Exec 메서드는 sql.Result와 error 객체를 리턴하며, sql.Result 객체로부터 갱신된 레코드수(RowsAffected())와 새로 추가된 Id (LastInsertId())를 구할 수 있다.

2. Prepared Statement 사용

Prepared Statement는 데이타베이스 서버에 Placeholder를 가진 SQL문을 미리 준비시키는 것으로, 차후 해당 Statement를 호출할 때 준비된 SQL문을 빠르게 실행하도록 하는 기법이다. Go에서 Prepared Statement를 사용하기 위해서는 sql.DB의 Prepare() 메서드를 써서 Placeholder를 가진 SQL문을 미리 준비시키고, sql.Stmt 객체를 리턴받는다. 차후 이 sql.Stmt 객체의 Exec (혹은 Query/QueryRow) 메서드를 사용하여 준비된 SQL문을 실행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main
 
import (
    "database/sql"
    "log"
    _ "github.com/go-sql-driver/mysql"
)
 
func main() {
    // sql.DB 객체 생성
    db, err := sql.Open("mysql", "root:pwd@tcp(127.0.0.1:3306)/testdb")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
 
    // Prepared Statement 생성
    stmt, err := db.Prepare("UPDATE test1 SET name=? WHERE id=?")
    checkError(err)
    defer stmt.Close()
 
    // Prepared Statement 실행
    _, err = stmt.Exec("Tom", 1) //Placeholder 파라미터 순서대로 전달
    checkError(err)
    _, err = stmt.Exec("Jack", 2)
    checkError(err)
    _, err = stmt.Exec("Shawn", 3)
    checkError(err)
}
 
func checkError(err error) {
    if err != nil {
        panic(err)
    }
}
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.