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

코드 설명

  1. SQLite 드라이버 설치: github.com/mattn/go-sqlite3 패키지를 사용하여 SQLite 데이터베이스와 통신합니다.
  2. 메모리 데이터베이스 연결: sql.Open 함수를 사용하여 메모리 내 데이터베이스에 연결합니다. ":memory:" 데이터베이스 이름을 사용하면 SQLite가 메모리에서 데이터베이스를 생성합니다.
  3. 테이블 생성: createTable 함수는 CREATE TABLE SQL 명령어를 실행하여 users 테이블을 생성합니다.
  4. 데이터 삽입: insertUser 함수는 db.Exec를 사용하여 데이터를 삽입합니다. ? 플레이스홀더를 사용하여 안전하게 쿼리를 작성합니다.
  5. 데이터 조회: getUsers 함수는 db.Query를 사용하여 데이터를 조회하고, rows.Scan을 사용하여 결과를 구조체에 매핑합니다.
  6. 데이터 업데이트: updateUserAge 함수는 db.Exec를 사용하여 데이터를 업데이트합니다.
  7. 데이터 삭제: deleteUser 함수는 db.Exec를 사용하여 데이터를 삭제합니다.

이 예제는 기본적인 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 다루며, Go에서 메모리 데이터베이스를 사용하는 방법을 설명합니다. SQLite의 메모리 모드를 사용하면 테스트 및 개발 중에 간편하게 데이터베이스 작업을 수행할 수 있습니다.

 

출처 : chatGPT