go
GO sql db 처리
까오기
2024. 7. 16. 13:22
Go에서 SQL 데이터베이스를 사용하려면 database/sql 패키지를 활용합니다. 이 패키지는 SQL 데이터베이스에 접속하고, 쿼리를 실행하며, 결과를 처리하는 기능을 제공합니다. 일반적으로 database/sql 패키지는 특정 데이터베이스 드라이버와 함께 사용됩니다. 예를 들어, MySQL 데이터베이스를 사용하려면 github.com/go-sql-driver/mysql 패키지를 사용할 수 있습니다.
기본 사용 예제
아래 예제는 MySQL 데이터베이스를 사용하여 데이터베이스에 연결하고, 데이터를 삽입, 조회, 업데이트, 삭제하는 방법을 보여줍니다.
1. MySQL 드라이버 설치
먼저 MySQL 드라이버를 설치합니다.
go mod init
go get -u github.com/go-sql-driver/mysql // mysql
go get -u github.com/mattn/go-sqlite3 // sqlite3
2. Go 코드 작성
다음은 main.go 파일에 작성할 예제 코드입니다:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/mattn/go-sqlite3"
)
// User 구조체 정의
type User struct {
ID int
Name string
Age int
}
func main() {
// 메모리 데이터베이스에 연결
db, err := sql.Open("sqlite3", ":memory:")
if err != nil {
log.Fatalf("Error opening database: %v", err)
}
defer db.Close()
// 테이블 생성
createTable(db)
// 데이터 삽입
insertUser(db, "Alice", 30)
insertUser(db, "Bob", 25)
// 데이터 조회
users := getUsers(db)
for _, user := range users {
fmt.Printf("User: %v\n", user)
}
// 데이터 업데이트
updateUserAge(db, 1, 31)
// 데이터 삭제
deleteUser(db, 2)
}
// 테이블 생성 함수
func createTable(db *sql.DB) {
query := `
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
);`
_, err := db.Exec(query)
if err != nil {
log.Fatalf("Error creating table: %v", err)
}
fmt.Println("Successfully created table")
}
// 데이터 삽입 함수
func insertUser(db *sql.DB, name string, age int) {
query := "INSERT INTO users (name, age) VALUES (?, ?)"
_, err := db.Exec(query, name, age)
if err != nil {
log.Fatalf("Error inserting user: %v", err)
}
fmt.Println("Successfully inserted user")
}
// 데이터 조회 함수
func getUsers(db *sql.DB) []User {
query := "SELECT id, name, age FROM users"
rows, err := db.Query(query)
if err != nil {
log.Fatalf("Error querying users: %v", err)
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
err := rows.Scan(&user.ID, &user.Name, &user.Age)
if err != nil {
log.Fatalf("Error scanning user: %v", err)
}
users = append(users, user)
}
return users
}
// 데이터 업데이트 함수
func updateUserAge(db *sql.DB, id int, age int) {
query := "UPDATE users SET age = ? WHERE id = ?"
_, err := db.Exec(query, age, id)
if err != nil {
log.Fatalf("Error updating user age: %v", err)
}
fmt.Println("Successfully updated user age")
}
// 데이터 삭제 함수
func deleteUser(db *sql.DB, id int) {
query := "DELETE FROM users WHERE id = ?"
_, err := db.Exec(query, id)
if err != nil {
log.Fatalf("Error deleting user: %v", err)
}
fmt.Println("Successfully deleted user")
}
코드 설명
- SQLite 드라이버 설치: github.com/mattn/go-sqlite3 패키지를 사용하여 SQLite 데이터베이스와 통신합니다.
- 메모리 데이터베이스 연결: sql.Open 함수를 사용하여 메모리 내 데이터베이스에 연결합니다. ":memory:" 데이터베이스 이름을 사용하면 SQLite가 메모리에서 데이터베이스를 생성합니다.
- 테이블 생성: createTable 함수는 CREATE TABLE SQL 명령어를 실행하여 users 테이블을 생성합니다.
- 데이터 삽입: insertUser 함수는 db.Exec를 사용하여 데이터를 삽입합니다. ? 플레이스홀더를 사용하여 안전하게 쿼리를 작성합니다.
- 데이터 조회: getUsers 함수는 db.Query를 사용하여 데이터를 조회하고, rows.Scan을 사용하여 결과를 구조체에 매핑합니다.
- 데이터 업데이트: updateUserAge 함수는 db.Exec를 사용하여 데이터를 업데이트합니다.
- 데이터 삭제: deleteUser 함수는 db.Exec를 사용하여 데이터를 삭제합니다.
이 예제는 기본적인 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 다루며, Go에서 메모리 데이터베이스를 사용하는 방법을 설명합니다. SQLite의 메모리 모드를 사용하면 테스트 및 개발 중에 간편하게 데이터베이스 작업을 수행할 수 있습니다.
출처 : chatGPT