Programming

go 언어 db ORM framework best

IT오이시이 2024. 8. 19. 15:17
728x90

go 언어  db  ORM framework  best 




각각의 Go 언어 데이터베이스 입출력 프레임워크를 예시와 함께 비교해드릴게요.



1. GORM

GORM은 Go에서 가장 인기 있는 ORM 패키지 중 하나로, 코드 우선 접근 방식을 사용합니다. 스키마 자동 마이그레이션, 로깅, 준비된 문, 제약 조건 등을 지원합니다.

예시:
```go
package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

type User struct {
    ID   uint
    Name string
    Age  int
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    db.AutoMigrate(&User{})

    db.Create(&User{Name: "Alice", Age: 30})

    var user User
    db.First(&user, 1)
    fmt.Println(user.Name)
}
```



2. SQLX

SQLX는 표준 `database/sql` 패키지를 확장하여 더 편리한 인터페이스를 제공합니다.
구조체와 함께 SQL 쿼리를 쉽게 작성하고 실행할 수 있습니다.


예시:
```go
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-sqlite3"
    "github.com/jmoiron/sqlx"
)

type User struct {
    ID   int    `db:"id"`
    Name string `db:"name"`
    Age  int    `db:"age"`
}

func main() {
    db, err := sqlx.Connect("sqlite3", "./test.db")
    if err != nil {
        panic(err)
    }

    db.MustExec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")

    db.MustExec("INSERT INTO users (name, age) VALUES ($1, $2)", "Alice", 30)

    var user User
    db.Get(&user, "SELECT * FROM users WHERE id=$1", 1)
    fmt.Println(user.Name)
}
```




3. Beego ORM

Beego ORM은 Beego 웹 프레임워크의 일부로, 독립적으로도 사용할 수 있습니다. 자동 마이그레이션, 관계 설정, 쿼리 빌더 등을 지원합니다.

예시:
```go
package main

import (
    "github.com/astaxie/beego/orm"
    _ "github.com/mattn/go-sqlite3"
)

type User struct {
    ID   int    `orm:"auto"`
    Name string `orm:"size(100)"`
    Age  int
}

func init() {
    orm.RegisterDataBase("default", "sqlite3", "data.db")
    orm.RegisterModel(new(User))
    orm.RunSyncdb("default", false, true)
}

func main() {
    o := orm.NewOrm()
    user := User{Name: "Alice", Age: 30}
    o.Insert(&user)

    var u User
    o.QueryTable("user").Filter("ID", 1).One(&u)
    fmt.Println(u.Name)
}
```




4. SQLBoiler

4.1. 설치
먼저 SQLBoiler와 드라이버를 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다:

go install github.com/volatiletech/sqlboiler/v4@latest
go install github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-mysql@latest

4.2. 데이터베이스 설정
데이터베이스를 설정하고, SQLBoiler가 사용할 수 있도록 설정 파일을 작성합니다. 예를 들어, MySQL을 사용하는 경우 sqlboiler.toml 파일을 다음과 같이 작성합니다:

[mysql]
  dbname = "your_db_name"
  host = "localhost"
  user = "your_user"
  pass = "your_password"
  sslmode = "disable"

4.3. 모델 생성
데이터베이스 스키마를 기반으로 모델을 생성합니다. 다음 명령어를 실행하여 모델을 생성할 수 있습니다:

sqlboiler mysql

4.4. 코드 사용
생성된 모델을 사용하여 데이터베이스와 상호작용할 수 있습니다. 예를 들어, User 테이블에서 데이터를 조회하는 코드는 다음과 같습니다:

Go

package main

import (
    "log"
    "github.com/volatiletech/sqlboiler/v4/boil"
    "github.com/volatiletech/sqlboiler/v4/queries/qm"
    "your_project/models"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "your_user:your_password@tcp(localhost:3306)/your_db_name")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    users, err := models.Users(qm.Where("name=?", "Alice")).All(context.Background(), db)
    if err != nil {
        log.Fatal(err)
    }

    for _, user := range users {
        log.Println(user.Name, user.Email)
    }
}

 


4.5 예시2:
```go
// 먼저 SQLBoiler를 사용하여 코드를 생성해야 합니다.
// `sqlboiler sqlite3` 명령을 실행하여 모델을 생성합니다.

package main

import (
    "fmt"
    "log"
    "github.com/volatiletech/sqlboiler/v4/boil"
    "github.com/volatiletech/sqlboiler/v4/queries/qm"
    "github.com/volatiletech/sqlboiler/v4/types"
    _ "github.com/mattn/go-sqlite3"
    "github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-sqlite3/driver"
    "github.com/volatiletech/sqlboiler/v4/models"
)

func main() {
    db, err := driver.New("sqlite3", "./test.db")
    if err != nil {
        log.Fatal(err)
    }
    boil.SetDB(db)

    user := models.User{Name: "Alice", Age: 30}
    err = user.Insert(db, boil.Infer())
    if err != nil {
        log.Fatal(err)
    }

    u, err := models.Users(qm.Where("id=?", 1)).One(db)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(u.Name)
}
```

 





5. Ent

Ent는 Facebook에서 개발한 Go 언어용 ORM(Object-Relational Mapping) 프레임워크입니다. Ent를 사용하면 Go 코드로 데이터베이스 스키마를 정의하고, 이를 바탕으로 자동으로 코드를 생성할 수 있습니다. 

참고: https://entgo.io/docs/tutorial-setup/#installation

5.1. 설치
먼저 Ent를 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다:

```
go get entgo.io/ent/cmd/ent
```

5.2. 스키마 생성
Ent CLI를 사용하여 스키마를 생성합니다. 예를 들어, User라는 엔티티를 생성하려면 다음 명령어를 실행합니다:

$ go run entgo.io/ent/cmd/ent init {{엔티티 이름}}   //  엔티티 이름을 바탕으로한 초기 스키마 코드 생성
$ go generate ./ent                          //  정의했던 스키마를 바탕으로 한 많은 boilerplate 코드를 자동으로 생성


```
$ go run entgo.io/ent/cmd/ent init User
```

이 명령어를 실행하면 프로젝트 디렉토리에 ent/schema/user.go 파일이 생성됩니다.

5.3. 스키마 정의
생성된 파일에서 엔티티의 필드와 관계를 정의합니다. 예를 들어, User 엔티티의 필드를 정의하는 방법은 다음과 같습니다:

```
Go

package schema

import (
    "entgo.io/ent"
    "entgo.io/ent/schema/field"
)

// User holds the schema definition for the User entity.
type User struct {
    ent.Schema
}

// Fields of the User.
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name"),
        field.String("email"),
    }
}

 

5.4. 코드 생성
스키마를 정의한 후, 다음 명령어를 실행하여 코드를 생성합니다:

```
$ go generate ./ent
```

5.5. 데이터베이스 연결 및 사용
데이터베이스에 연결하고 엔티티를 사용하려면 다음과 같이 코드를 작성합니다:


Go
```
package main

import (
    "context"
    "log"
    "entgo.io/ent/dialect/sql"
    _ "github.com/mattn/go-sqlite3"
    "your_project/ent"
)

func main() {
    // 데이터베이스 연결
    client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1")
    if err != nil {
        log.Fatalf("failed opening connection to sqlite: %v", err)
    }
    defer client.Close()

    // 데이터베이스 스키마 생성
    if err := client.Schema.Create(context.Background()); err != nil {
        log.Fatalf("failed creating schema resources: %v", err)
    }

    // 새로운 사용자 생성
    user, err := client.User.
        Create().
        SetName("Alice").
        SetEmail("alice@example.com").
        Save(context.Background())
    if err != nil {
        log.Fatalf("failed creating user: %v", err)
    }
    log.Println("user was created: ", user)
}



참조 :
(1) Comparing the 7 best ORM packages in Go - LogRocket Blog.https://blog.logrocket.com/comparing-orm-packages-go/." target="_blank" rel="noopener" data-mce-href=" https://blog.logrocket.com/comparing-orm-packages-go/."> https://blog.logrocket.com/comparing-orm-packages-go/.
(2) Comparing the best Go ORMs (2024) – Encore.https://encore.dev/resources/go-orms." target="_blank" rel="noopener" data-mce-href=" https://encore.dev/resources/go-orms."> https://encore.dev/resources/go-orms.
(3) Comparing database/sql, GORM, sqlx, and sqlc | The GoLand Blog.https://blog.jetbrains.com/go/2023/04/27/comparing-db-packages/." target="_blank" rel="noopener" data-mce-href=" https://blog.jetbrains.com/go/2023/04/27/comparing-db-packages/."> https://blog.jetbrains.com/go/2023/04/27/comparing-db-packages/.


728x90
반응형