2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

golang dbr

Last updated at Posted at 2020-02-05

どうしてもdbrを使わないといけない場面に出くわしたので、忘れそうなものを記録する
SELECTの情報が少なすぎる。
どうやって、SQLビルダーから、文字列を追い出すか、それが問題だ・・・

①godocから探る
https://godoc.org/github.com/gocraft/dbr

①テストから、探る
https://github.com/gocraft/dbr/blob/master/select_test.go

※例なのでテーブル名、カラム名に変数は使わず記述している

#Joinしたテーブルに別名をつける

LeftJoin(dbr.I("users").As("staffs"), "staff.id=companies.user_id").

#サブクエリにエイリアスをつける。サブクエリをJoinする

	subQuery := Select("company_id").
		From("users").
		Where("id = ?", userId).
		As("staffs")

	_, err := Select("*")
		From("companies").
		LeftJoin(subQuery, "staffs.company_id=companies.id").
		Load(&results)

構造体にではなく、単一のカラムをプリミティブな型のスライスに取得

一時変数を、いちいち構造体定義するのは面倒。また構造体をスライスに変換する手間もコードが汚れる
取得したらIN句などで利用する

	var myCompanyUserIds []int64
	_, err := Select("users.id").
		From("users").
		Where("users.company_id = ?", myCompanyID).
		Load(&myCompanyUserIds)

#プレースホルダを使わず Whereを記述する

Where(dbr.Eq("company.id", myCompanyID))

複合条件的なWhereを記述する

Where(
	dbr.Or(
		dbr.Eq("company.id", myCompanyID1),
		dbr.Eq("company.id", myCompanyID2),
	),
)
// OrはAnd, EqはNeq、Like、、NotLike,Lt,Lte,Gt,Gte,Exprなどに差し替え可能

#生のSQL式を途中に挟む

// プレースホルダも使える
dbr.Expr("REPLACE(CONCAT(`user`.`last_name`, `user`.`first_name`),' ','') like ?", term),
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?