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
k_yoshikawa
June 26, 2019
Programming
2
820
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
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
150
ゲームの物理 剛体編
fadis
0
380
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.4k
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
140
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
420
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
130
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
160
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
430
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
120
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3.1k
Python札幌 LT資料
t3tra
7
1.1k
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
600
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
4.9k
Design in an AI World
tapps
0
100
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
90
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Building the Perfect Custom Keyboard
takai
1
660
The Cost Of JavaScript in 2023
addyosmani
55
9.4k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Why Our Code Smells
bkeepers
PRO
340
57k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
760
Test your architecture with Archunit
thirion
1
2.1k
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