DB をローカルの Mac で適当に動かして、Golang を書いて試していきたいと思います。
Docker で PostgreSQL を立てます。(立て方と準備は、最後に記載しています)
当記事のサンプルコードをまとめて、GitHub においておきました。
Golang のコード
以下を試してみたいと思います。
- database/sql
-
gorm (GitHub
6876)
-
gorp (GitHub
2576)
-
dbr (GitHub
854)
-
xorm (GitHub
2409)
-
sqlx (GitHub
3405)
-
genmai (GitHub
143) (追記)
※ 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)