Help us understand the problem. What is going on with this article?

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

More than 1 year has 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)
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.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした