福野泰介の一日一創 - create every day

昨日に続き、食がテーマだったjigインターン2019、成果発表会紹介2チーム目。
今度は外食での悩みをモダンに解決するプロダクト。

チームnpm派「めしめーと」
箒コウモリ(香川高専高松キャンパス)、でみ(舞鶴高専)、watano(茨城高専)、はたはた(津山高専)


せっかくなら美味しいものを開拓したい外食。でも、レビューが当てになるとは限らない。そんな時、自分と味覚が近い人を頼ろう!
食べたものを投稿・チェックインすると、同じ好みな人をリコメンド。フォローすると優先的にタイムラインに並び、使うほどにヒット率上昇。


しゃもじをポインターとして解説する、はたはた。フロントエンドはモダンなフレームワーク Vue.js


GitHubのリポジトリから動かしてみました!(Foodmates-client (fixWholeDesignFinally) / server


幻の第4スプリントで、箒コウモリ(ホウモリ)がマージした、レスポンシブデザインバージョンで、スマホでもタブレットでも見やすい!


バックエンドは、Go言語(golang)で開発、データベースとしてMySQL、環境構築にDockerを使用。

ナウなDBの使い方を確認するため、Foodmatesのサーバー側を抜粋した、GoでMySQLにデータをいれてみるサンプル作成。
料理を、名前、価格、URLの3項目で、登録日時付きで、どんどん登録するシンプルなデータベースです。(src on GitHub)

package main import ( "fmt" "os" "time" "errors" "github.com/jinzhu/gorm" "github.com/joho/godotenv" _ "github.com/go-sql-driver/mysql" ) type Food struct { ID int `gorm:"primary_key" json:"id"` CreatedAt time.Time `json:"created_at"` Name string `gorm:"default:''" json:"name"` Price int `json:"price"` URL string `json:"url"` } var db *gorm.DB func InitDB() { USER := os.Getenv("MYSQL_USER") PASS := os.Getenv("MYSQL_PASSWORD") PROTOCOL := "" DBNAME := os.Getenv("MYSQL_DATABASE") CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8mb4&parseTime=True&loc=Local" var err error db, err = gorm.Open("mysql", CONNECT) // github.com/go-sql-driver/mysql if err != nil { panic(err.Error()) } db.LogMode(true) db.AutoMigrate(&Food{}) } func TruncateTables() { rows, err := db.Raw("SHOW TABLES").Rows() if err != nil { panic(err.Error()) } defer rows.Close() for rows.Next() { var table string if err := rows.Scan(&table); err != nil { panic(err.Error()) } db.Exec("TRUNCATE TABLE " + table) } } func GetDB() (*gorm.DB, error) { if db == nil { return nil, errors.New("can't get database") } return db, nil } func Finalize() error { err := db.Close() return err } func ShowAllFoods() { db, err := GetDB() if err != nil { fmt.Println(err) return } var foods []Food db.Table("Foods").Find(&foods) fmt.Println(foods) } func AddFood(name string, price int, url string) error { db, err := GetDB() if err != nil { return err } db.Create(&Food{ Name: name, Price: price, URL: url, CreatedAt: time.Now() }) return nil } func main() { err := godotenv.Load(".env") if err != nil { fmt.Println("Error loading .env file") return } InitDB() TruncateTables() AddFood("サラダ焼", 120, "https://www.sanrokusyoten-316.co.jp/products.html") AddFood("サバエドッグ", 280, "https://www.meat-sasaki.com") AddFood("眼鏡堅麺麭", 864, "http://echizen-yumekobo.com/?pid=52337987") ShowAllFoods() }

GORMを使うと、Go言語の構造体として定義したFoodを、db.AutoMigrate(&Food{})で呼び出せば、いい感じにテーブル生成をやってくれます。*GORM - ORM (Object-relational mapping / オブジェクト・リレーショナル・マッピング) for Go

MySQLのセットアップ、Mac編(参考、Mac へ MySQL を Homebrew でインストールする手順 - Qiita

brew update brew install mysql

MySQLにデータベースを1つ作成

mysql -uroot -p [dbrootpass] create database [dbname] create user '[dbuser]'@'localhost' identified by '[dbpass]'; grant all on *.* to '[dbuser]'@'localhost'; GRANT ALL PRIVILEGES ON [dbname].* TO '[dbuser]]'@'localhost'; exit

Go言語の設定ファイル「.env」にDB設定を記述

cat > .env <<EOF MYSQL_USER=[dbuser] MYSQL_PASSWORD=[dbpass] MYSQL_DATABASE=[dbname] EOF

Go言語のライブラリを取得

go get github.com/go-sql-driver/mysql go get github.com/jinzhu/gorm go get github.com/joho/godotenv

あとは動かすだけ!

go run fooddb.go [{1 2019-09-08 13:24:51 +0900 JST サラダ焼 120 https://www.sanrokusyoten-316.co.jp/products.html} {2 2019-09-08 13:24:51 +0900 JST サバエドッグ 280 https://www.meat-sasaki.com} {3 2019-09-08 13:24:51 +0900 JST 眼鏡堅麺麭 864 http://echizen-yumekobo.com/?pid=52337987}]

MySQLを初めて使ったのはもう20年前くらいかも・・・。
環境構築も、ライブラリも、便利になっていい感じですね!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像