1. MySql 삽입,갱신,삭제
데이타를 INSERT, UPDATE, DELETE (DML Operation)하기 위해서 sql.DB 객체의 Exec() 메서드를 사용한다. Query/QueryRow 메서드는 데이타를 리턴할 때 사용하는 반면, DML과 같이 리턴되는 데이타가 없는 경우는 Exec 메서드를 사용해야 한다.
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문을 실행한다.
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) } }