Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
43
Help us understand the problem. What is going on with this article?
@mochizukikotaro

Golang の DB 操作 ORM をいろいろしらべてみたい

More than 3 years have passed since last update.

DB をローカルの Mac で適当に動かして、Golang を書いて試していきたいと思います。
Docker で PostgreSQL を立てます。(立て方と準備は、最後に記載しています)

当記事のサンプルコードをまとめて、GitHub においておきました。

Golang のコード

以下を試してみたいと思います。

※ star 数は 2017/10/26 時点
※ 未チェックはまだ触れていません

やること

以下のユーザデータを select するサンプルを考えてみたいと思います。

postgres=# select * from users;
 id | name
----+------
  1 | taro
  2 | yuki

database/sql

main.go
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
)

func main() {

    type User struct {
        Id   int
        Name string
    }

    db, _ := sql.Open("postgres",
        "user=postgres password=pw dbname=postgres sslmode=disable")

    rows, err := db.Query(`SELECT * FROM "users"`)
    if err != nil {
        fmt.Println(err)
    }

    defer rows.Close()

    users := []User{}
    user := User{}
    for rows.Next() {
        err = rows.Scan(&user.Id, &user.Name)
        if err != nil {
            fmt.Println(err)
        }
        users = append(users, user)
    }
    fmt.Println(users)
}

これで、以下を得ました。

[{1 taro} {2 yuki}]

簡単ですね。

gorm

package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/lib/pq"
)

func main() {

    type User struct {
        Id   int
        Name string
    }

    db, _ := gorm.Open("postgres",
        "user=postgres password=pw dbname=postgres sslmode=disable")
    defer db.Close()

    var users []User
    db.Find(&users) // SELECT * FROM users;
    fmt.Println(users)
}

すごく簡単ですね。

gorp

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
    "github.com/go-gorp/gorp"
)

func main() {

    dbmap := initDb()
    defer dbmap.Db.Close()

    users := []User{}
    dbmap.Select(&users, "select * from users")
    fmt.Println(users)
}

type User struct {
    Id   int
    Name string
}

func initDb() *gorp.DbMap {
    db, _ := sql.Open("postgres",
        "user=postgres password=pw dbname=postgres sslmode=disable")
    dbmap := &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
    dbmap.AddTableWithName(User{}, "users").SetKeys(true, "Id")
    return dbmap
}

うーん。

dbr

package main

import (
    "fmt"
    "github.com/gocraft/dbr"
    _ "github.com/lib/pq"
)

func main() {

    type User struct {
        Id   int
        Name string
    }

    conn, _ := dbr.Open("postgres",
        "user=postgres password=pw dbname=postgres sslmode=disable", nil)

    sess := conn.NewSession(nil)

    users := []User{}
    sess.Select("id", "name").From("users").Load(&users)
    fmt.Println(users)
}

うーん。

sqlx

package main

import (
    "fmt"
    "github.com/jmoiron/sqlx"
    _ "github.com/lib/pq"
)

func main() {

    type User struct {
        Id   int
        Name string
    }

    db, _ := sqlx.Open("postgres",
        "user=postgres password=pw dbname=postgres sslmode=disable")

    users := []User{}
    db.Select(&users, "select * from users")
    fmt.Println(users)
}

わあ、とても簡単だぁ。

感想まとめ

  • Rails みたいにやるなら gorm かなぁ
  • 生で database/sql だけでやるのもありかなぁ
  • 生も好きだけど小気味よくいきたいなら sqlx かなぁ

個人的には sqlx が好きそうです。

注意) 今回は簡単な select しか試していないので、アレですが... 😶

PostgreSQL の準備

まずは、コンテナを立てます。

コンテナたてる
$ docker run --name some-postgres -e POSTGRES_PASSWORD=pw -p 5432:5432 -d postgres

ログインができるようになります。

ログイン
$ psql -U postgres -h localhost
Password for user postgres:

psql 内で、適当に table と データを用意しておきます。

テーブルつくってデータいれる
postgres=# create table users (id serial, name varchar(80));
CREATE TABLE
postgres=# insert into users (name) values ('taro'), ('yuki');
INSERT 0 2
postgres=# select * from users;
 id | name
----+------
  1 | taro
  2 | yuki
(2 rows)
43
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
43
Help us understand the problem. What is going on with this article?