Go言語でのPost/Getとデータベース連携
今回は前回から導入したGo言語+GinでPost/Getをリクエストを受けとり、受け取ったデータをデータベースに書き込む処理について書いていきたいと思います!!
使用するデータベースはsqlite3にしました(特に理由はないですが、強いて言うなら慣れているためですw)。
Go言語やGinの導入については、こちらをご参照ください。
elsammit-beginnerblg.hatenablog.com
■Get方法
Getは前回のソースにも登場していますが、Getリクエストにて渡されたデータを受け取るところは未記載でした。
リクエストにて渡されるデータを取得する場合にはこちらのように実装すればよいです。
func Do_Get(){ r := gin.Default() r.GET("/Get", func(c *gin.Context) { ret := c.Query("hoge") fmt.Println("hoge:",ret) c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() }
こちらは、
http://アドレス:8080/Get?hoge="データ値"
のように指定してGetリクエストを行われた場合、hogeに与えられたデータ値をret変数に格納する実装になっております。
■Post方法
次にPostです。
Postにてこちらのようなjsonデータを受け取ることを想定します。
{ "Id":"1", "Name":"namae" }
上記jsonデータを受け取る実装はこちらになります。
type Test struct { Id string Name string } func Do_Post(){ r := gin.Default() r.POST("/ping/", func(c *gin.Context) { var js Test c.BindJSON(&js) c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() }
jsonデータと同じ構成の構造体をあらかじめ用意しておき、こちらの構造体にjsonデータを直接格納すればよいです。
■Sqlite3への書き込み
前提として、下記データベースが用意されているものとします。
DB名:db.sql テーブル名:NameTbl カラム名:id, Name
まずこちらを実行し、go言語でsqlite3を使えるようにします。
go get github.com/mattn/go-sqlite3
そして、sqlite3へのデータ書き込みはこちらになります。
DB_Write関数の引数として与えられたId, Nameをデータベースに書き込んでいます。
import ( "database/sql" "fmt" "log" "github.com/gin-gonic/gin" _ "github.com/mattn/go-sqlite3" ) func DB_Write(Id string, Name string){ DbConnection, err1 := sql.Open("sqlite3", "./db.sql") if err1 != nil { log.Fatal(err1) } cmd := "INSERT INTO NameTbl (id, name) VALUES (?, ?)" _, err := DbConnection.Exec(cmd, Id, Name) if err != nil { log.Fatalln(err) } }
・sql.Openでdb,sqlへのコネクション実行
・コネクションしたdb.sqlに対して、cmdで定義したコマンドを.Exec関数で実行
といった処理の流れになります。
また、コマンドに変数を与える場合には、"?"を利用しExec関数の引数として与えればよいようです。
■最後に
Go言語はまだまだ勉強中です。
写経レベルしか出来ていないので、使いながら慣れていきたいと思います。
■参考
Golang+Ginについての備忘録(ちょこっとGorm) - Qiita
(メモ)mattn/go-sqlite3を使ってみた - Qiita