インドカレーファンクラブ

パソコン、カメラ

【Go】sqliteとsqlxをおためしするだけ

概要

おためし用コード

テーブルをSeletctしてEntityにマッピングしたり、その時にフィールドにEnumがあったり、
EntityをそのままInsertしたり...

そういうのを一応動かしてみたかった
ついでにsqliteもお勉強のために使う

というコードを書いたのでせっかくだからのせる

sqlxの使い方は公式のreadmeみたほうがはやい

GitHub - jmoiron/sqlx: general purpose extensions to golang's database/sql

DB系ライブラリでどれ使おうか迷ってsqlxにした話も書きたい気持ちはあるけどまとめサイトみたいな感じにしかならないからまあいいか

構成

  • main.go
  • test.db(sqliteが作ってくれる)
  • enum
    • member_type
      • membertype.go

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")
}