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) } } |