Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GolangとMySQLを接続して、APIを作ってみた
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
k_yoshikawa
June 26, 2019
Programming
2
830
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
CSC307 Lecture 06
javiergs
PRO
0
690
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
4k
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
150
AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例
tonkotsuboy_com
7
2.4k
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
230
CSC307 Lecture 09
javiergs
PRO
1
840
AgentCoreとHuman in the Loop
har1101
5
250
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
140
Gemini for developers
meteatamel
0
100
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.7k
今から始めるClaude Code超入門
448jp
8
9.1k
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.5k
Featured
See All Featured
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
650
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
290
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
66
37k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
170
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Building Adaptive Systems
keathley
44
2.9k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
120
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
110
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