post Image
Gin Web Framework と GORM を使って簡単なウェブアプリを作ってみる

はじめに

本稿では Gin Web Framework と Go 用の ORM パッケージである GORM を使って、データベースからデータを検索し表示するまでの手順を説明します。
今回はテストなので SQLite を使っていますが、GORM は他に MySQL、PostgreSQL などの一般的なデータベースをサポートしています。

参考: GORM Guide
http://jinzhu.me/gorm/database.html#connecting-to-a-database

なお、本稿では既に Go と Gin をインストールしている前提で手順を説明します。
そこまでの手順については、僕が以前書いた「Ubuntu 16.04 に GoLang 1.6 と Gin Web Framework をインストールし、HTMLテンプレートを読み込むまで」という記事がありますので、こちらをご参考にしてください。
http://qiita.com/kent_ocean/items/5bfb7b69973f78b8c843

sqlite3 をインストール

今回はデータベースに SQLiteを使いますのでインストールします

apt-get install sqlite3

テスト用のデータベースファイルを作成

SQLite データベースファイルを作成します。
「Product」というテーブルを作成し、「Code」「Name」「Price」という3つのカラムを用意します。

cd var/www/go
sqlite3 test.sqlite3
SQLite version 3.11.0
Enter ".help" for instructions
sqlite> create table Product(Code, Name, Price);
sqlite> .quit

GORM をインストール

go get -u github.com/jinzhu/gorm

go-sqlite3 をインストール

go get -u github.com/mattn/go-sqlite3

コードを書く

以下のようなファイル構成でテストコードを作成していきます。

go
├─templates
│    ─index.tmpl (テンプレートファイル)
└─index.go

テンプレートファイルを作成

mkdir templates
sudo vim templates/index.tmpl
templates/index.tmpl
<html>
<head>
</head>
<body>
    <h1>
        {{ .title }}
    </h1>
<form method="get" action="search">
<p><input type="search" name="keyword" size="30" placeholder="Search" required> <input type="submit" value="Search"></p></form>
{{ .info }}
</body>
</html>

テストコードを作成

sudo vim index.go
index.go
package main

import (
  "github.com/gin-gonic/gin"
  "github.com/jinzhu/gorm"
  _ "github.com/mattn/go-sqlite3"
  "net/http"
  "fmt"
)

type Product struct {
  gorm.Model
  Code string
  Name string
  Price uint
}

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("templates/*")

    init()

    router.GET("/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.tmpl", gin.H{
            "title": "Main website",
            "info": "",
        })
    })

    //router.GET("/search/:keyword", func(c *gin.Context) {
    router.GET("/search", func(c *gin.Context) {
        var keyword string
        //keyword = c.Param("keyword")
        keyword = c.Query("keyword")

        var info string
        info = read(keyword)
        c.HTML(http.StatusOK, "index.tmpl", gin.H{
            "title": "Main website",
            "info": info,
        })
    })

    router.Run(":8080")
}

//テスト用データベースの初期化
func init() {
    db, err := gorm.Open("sqlite3", "test.sqlite3")
    if err != nil {
        panic("failed to connect database")
    }

    // Migrate the schema
    db.AutoMigrate(&Product{})

    // Create
    db.Create(&Product{Code: "L0001", Name: "Apple", Price:  1000})
    db.Create(&Product{Code: "L0002", Name: "Orange", Price:  100})
    db.Create(&Product{Code: "L0003", Name: "Banana", Price: 2000})
    db.Create(&Product{Code: "L0004", Name: "Papaya", Price: 5000})
    db.Create(&Product{Code: "L0005", Name: "Mango", Price:  3000})
}


func read(keword string) string {

    db, err := gorm.Open("sqlite3", "test.sqlite3")
    if err != nil {
        panic("failed to connect database")
    }

    // Read
    var product Product
    db.First(&product, "Name = ?", keyword) // find product with name

    var info string
    info += "Name: " + fmt.Sprint(product.Name)
    info += " Price: " + fmt.Sprint(product.Price)

    return info
}

ブラウザから確認

では、テストコードを実行し、ブラウザから確認してみます。

go run index.go

ブラウザから
http://(IP Address):8080/index
にアクセス

↓ のように表示されるはずです。

001.png

検索してみる

次に検索ボックスに「Banana」と入力し、検索ボタンを押してみてください。
以下のように表示されるはずです。

002.png


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。