go 언어 db ORM framework best
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/.