【Go】sqliteとsqlxをおためしするだけ
概要
おためし用コード
テーブルをSeletctしてEntityにマッピングしたり、その時にフィールドにEnumがあったり、
EntityをそのままInsertしたり...
そういうのを一応動かしてみたかった
ついでにsqliteもお勉強のために使う
というコードを書いたのでせっかくだからのせる
sqlxの使い方は公式のreadmeみたほうがはやい
GitHub - jmoiron/sqlx: general purpose extensions to golang's database/sql
DB系ライブラリでどれ使おうか迷ってsqlxにした話も書きたい気持ちはあるけどまとめサイトみたいな感じにしかならないからまあいいか
構成
enum周りのフォルダ構成は...どうするのがいいかな
コード
よめば分かる
main.go
package main import ( "fmt" "log" membertype "sqlite_sqlx/enum/member_type" "github.com/jmoiron/sqlx" _ "github.com/mattn/go-sqlite3" ) // Driver // go get github.com/mattn/go-sqlite3 // sqlx // go get github.com/jmoiron/sqlx const dbPath = "./db.sql" const initQuery = ` DROP TABLE IF EXISTS members; CREATE TABLE members ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAE(20) DEFAULT '', type INTEGER DEFAULT NULL -- 1:Human, 2:Beast, 3:Elf ); INSERT INTO members (name, type) VALUES ("ペコリーヌ", 1); INSERT INTO members (name, type) VALUES ("コッコロ", 3); INSERT INTO members (name, type) VALUES ("キャル", 2); ` type Member struct { ID int `db:"id"` Name string `db:"name"` Type membertype.MemberType `db:"type"` } func main() { // ドライバ名 + データソース名(なかったら作ってくれる) db, err := sqlx.Connect("sqlite3", "test.db") if err != nil { log.Fatalln(err) } // テーブルだけつくる db.MustExec(initQuery) // データ入れる chris := &Member{ Name: "クリスティーナ", Type: membertype.Human, } transaction := db.MustBegin() transaction.NamedExec("INSERT INTO members (name, type) VALUES (:name, :type)", chris) transaction.Commit() // Select members := []Member{} err = db.Select(&members, "SELECT id, name, type FROM members") if err != nil { log.Fatalln(err) } // 見てみる for _, member := range members { // Typeは型がMemberTypeでそれらはString()メソッドを実装してるのでいい感じに出してくれる fmt.Println(member.ID, member.Name, member.Type) } } // 出力 // 1 ペコリーヌ ヒューマン // 2 コッコロ エルフ // 3 キャル ビースト // 4 クリスティーナ ヒューマン
membertype.go
package membertype type MemberType int const ( _ MemberType = iota Human Beast Elf ) func (t MemberType) String() string { switch t { case Human: return "ヒューマン" case Beast: return "ビースト" case Elf: return "エルフ" case 0: panic("Unknown") } panic("Unknown value") }