Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GolangとMySQLを接続して、APIを作ってみた
Search
k_yoshikawa
June 26, 2019
Programming
2
810
GolangとMySQLを接続して、APIを作ってみた
DOG #2 で登壇した際のスライドです。
Golangは初心者の域を超えていませんが、使ってみて課題等が浮き彫りになってきた事を話してみました。
k_yoshikawa
June 26, 2019
Tweet
Share
More Decks by k_yoshikawa
See All by k_yoshikawa
Qiitaでバズった勉強会をやってみて、 さらにそれをQiitaに書いたら、 その記事がバズってしまった話
k_yoshikawa
0
180
Laravelの開発環境構築、何が良いか比較検証してみた.pdf
k_yoshikawa
0
3.4k
Other Decks in Programming
See All in Programming
AIコーディングエージェント(Gemini)
kondai24
0
210
20251212 AI 時代的 Legacy Code 營救術 2025 WebConf
mouson
0
110
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
240
開発に寄りそう自動テストの実現
goyoki
1
890
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
6
1.8k
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
400
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
210
dotfiles 式年遷宮 令和最新版
masawada
1
760
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
110
AIコーディングエージェント(Manus)
kondai24
0
170
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
shogo4131
8
2.3k
CSC509 Lecture 14
javiergs
PRO
0
220
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
54k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Site-Speed That Sticks
csswizardry
13
1k
Making Projects Easy
brettharned
120
6.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
70k
Speed Design
sergeychernyshev
33
1.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
GolangとMySQLを接続して、 APIを作ってみた 2019/6/26 @DOG #2 k_yoshikawa
自己紹介 名前:吉川和樹(k_yoshikawa) 所属:株式会社デザインワン・ジャパン アカウント: twitter: @hunhunyosshy qiita: @k_yoshikawa スキル: エンジニア歴4年弱(=PHPer)
Goは多分15時間くらい
注意事項 • 本内容は所属組織としての発表ではありません • Go素人がなんとか奮闘した物語です • 参考レベルに留めていただけると嬉しいです • 行数の関係上、説明に不要なコードはスライドには書いていません •
ですので、このままではエラーが起こるものが多数あります • 詳細は、 GitHub をご覧ください
目次 1. 前提の話をしてみた! 2. SQLドライバーを使ってMySQLを接続してみた! 3. 環境変数設定ライブラリを使って環境変数を設定してみた! 4. 共通で使う処理を別ファイルにまとめてみようとした! 5.
ディレクトリ構成について少しだけ考えてみた! 6. MySQLから取ってきたRowデータを構造体に格納してみた! 7. WebAPIとしてjson形式で取得してみた! 8. まとめてみた!
もっといい感じに話せる内容を考えていた 1.前提の話をしてみた!
構成はこんな感じで妄想 バックエンド:Golang(Docker上で動かしたいなあ) DB: MySQL(どうしよっかなーAWSのサービス使っちゃおうかな) フロントエンド:Vue.js(Docker上で動かしたいなあ) その他:AWS上で動かしたいなあ 1.前提の話をしてみた!
ただ家庭/技術的な課題が多数あり・・・ 1.前提の話をしてみた!
発表に間に合わないので予定変更 バックエンド:Golang(Docker とりあえずローカル ) DB: MySQL(AWSのサービス とりあえずローカル) フロントエンド:Vue.js(Docker上で動かしたいなあ) その他:AWS上で動かしたいなあ APIを作ることに注力する!!
1. 前提の話をしてみた!
扱うデータはこれだけ(MySQLの意味・・・) 1. 前提の話をしてみた!
GolangとMySQLを接続して、 APIを作ってみた 2019/6/26 @DOG #2 k_yoshikawa
go-sql-driver/mysql https://github.com/go-sql-driver/mysql これを使って、mysqlを接続してみる! 2. SQLドライバーを使ってMySQLを接続してみた!
main.go import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main() {
db, err := sql.Open("mysql", "root:root@/shogi") ・・・ rows, err := db.Query("SELECT * FROM opening") 2. SQLドライバーを使ってMySQLを接続してみた!
接続できたけどパスワード丸出し・・・ 3.環境変数設定ライブラリを使って環境変数を設定してみた!
joho/godotenv https://github.com/joho/godotenv これを使って環境変数を設定する! 3.環境変数設定ライブラリを使って環境変数を設定してみた!
.env DB_NAME=***** DB_ROLE=***** DB_PASSWORD=********** 3.環境変数設定ライブラリを使って環境変数を設定してみた!!
func main() { err := godotenv.Load() if err != nil
{ panic(err.Error()) } db, err := sql.Open("mysql", os.Getenv("DB_ROLE") + ":" + os.Getenv("DB_PASSWORD") + "@/" + os.Getenv("DB_NAME") ・・・ rows, err := db.Query("SELECT * FROM opening") 3.環境変数設定ライブラリを使って環境変数を設定してみた!
この接続処理毎回書くの?やだなあ 4.共通で使う処理を別ファイルにまとめてみようとした!
func Connect() *sql.DB { err := godotenv.Load() ・・・ db, err
:= sql.Open("mysql", os.Getenv("DB_ROLE")+":"+os.Getenv("DB_PASSWORD")+"@/"+os.Get env("DB_NAME")) ・・・ return db } 4.共通で使う処理を別ファイルにまとめてみようとした!
あとはこれをimportすれば何とかなるはず! 4.共通で使う処理を別ファイルにまとめてみようとした!
あれ、ちょっと待てよ・・・ どこにどう置くといいのかなあ そういや「スタンダードがあるよ」て教えてもらったなあ ちょっと調べてみるか 5. ディレクトリ構成について少しだけ考えてみた!
golang-standards/project-layout https://github.com/golang-standards/project-layout そうそう、これこれ!こんなのあったわ! 5. ディレクトリ構成について少しだけ考えてみた!
golang-standards/project-layout その中の記述には・・・ /pkg Library code that's ok to use by
external applications (e.g., /pkg/mypubliclib). Other projects will import these libraries expecting them to work, so think twice before you put something here :-) 共通化できるファイルはpkg/配下に置けばいい(と判断) 5. ディレクトリ構成について少しだけ考えてみた!
golang-standards/project-layout 5. ディレクトリ構成について少しだけ考えてみた!
connect.go (これでsql接続処理はOKのはず!) import ( "database/sql" "os" _ "github.com/go-sql-driver/mysql" "github.com/joho/godotenv" )
func Connect() *sql.DB { ・・・ 5. ディレクトリ構成について少しだけ考えてみた!
openingdao.go (こんな感じでデータ取得を書く) import ( "github.com/hunhunyosshy/black-and-white/pkg/db" ) func FetchIndex() []Opening {
db := db.Connect() ・・・ 5. ディレクトリ構成について少しだけ考えてみた!
あれ、ちょっと待てよ・・・ どこにどう置くといいのかなあ そういや「スタンダードがあるよ」て教えてもらったなあ ちょっと調べてみるか 6. MySQLから取ってきたRowデータを構造体に格納してみた!
取得したデータはどう扱えばいいだろう・・・ 6. MySQLから取ってきたRowデータを構造体に格納してみた! 取ってきたときは、ただのRowsのデータ これだと扱いにくいなあ・・・ Goオブジェクトに似た「構造体」という概念があったなあ 構造体に格納してみるか!
openingdao.go //構造体を用意 type Opening struct { ID int `json:"id"` Name
string `json:"name"` } 6. MySQLから取ってきたRowデータを構造体に格納してみた!
openingdao.go (こんな感じでデータを格納!) func FetchIndex() []Opening { db := db.Connect() rows,
err := db.Query("SELECT * FROM opening”) openingArgs := make([]Opening, 0) for rows.Next() { var opening Opening err = rows.Scan(&opening.ID, &opening.Name) openingArgs = append(openingArgs, opening) } return openingArgs 6. MySQLから取ってきたRowデータを構造体に格納してみた!
gorilla/mux でルーティングしてみることに https://github.com/gorilla/mux 7. WebAPIとしてjson形式で取得してみた!
main.go func main() { r := mux.NewRouter() r.HandleFunc("/opening/", showOpeningIndex) log.Fatal(http.ListenAndServe(":8080",
r)) } func showOpeningIndex(w http.ResponseWriter, r *http.Request) { w.Write([]byte(jsonEncode(openingdao.FetchIndex()))) } 7. WebAPIとしてjson形式で取得してみた!
できた! 7. WebAPIとしてjson形式で取得してみた!
まとめ • チュートリアルを進めるのと、自分で考えて作るのでは全然違った ◦ 「やりたい」ことができなくてもどかしい • 他言語でできるものは、大抵Goでも何とかなりそう • 「他言語ならできるのに」のギャップを埋めるのは勉強になりそう •
実際に作ってみて、弱いところが浮き彫りになってきた ◦ 自分の場合ポインタ周りが弱いので、そのあたりはしっかり復習する • 実際に作るのは楽しいのでおすすめ!! 8.まとめてみた!
ご静聴ありがとうございました! 8.まとめてみた!
参考URL 前述したライブラリ群のGitHub • https://github.com/go-sql-driver/mysql • https://github.com/joho/godotenv • https://github.com/golang-standards/project-layout • https://github.com/gorilla/mux
その他参考にしたリンク • https://qiita.com/taizo/items/54f5f49c6102f86194b8 • https://qiita.com/sueken/items/87093e5941bfbc09bea8