CRUD 操作 (作成、読み取り、更新、削除) は、データベースを操作する場合の Web アプリケーションの基本機能です。この例では、Go と MySQL をデータベースとして使用して CRUD API を作成する方法を示します。
Go プロジェクトの依存関係を設定します。
go mod init app go get github.com/gin-gonic/gin go get gorm.io/gorm go get gorm.io/driver/mysql go get github.com/joho/godotenv
「example」という名前のテスト データベースを作成し、database.sql ファイルを実行してテーブルとデータをインポートします。
├─ .env ├─ main.go ├─ config │ └─ db.go ├─ controllers │ └─ product_controller.go ├─ models │ └─ product.go ├─ public │ └─ index.html └─ router └─ router.go
このファイルにはデータベース接続情報が含まれています。
DB_HOST=localhost DB_PORT=3306 DB_DATABASE=example DB_USER=root DB_PASSWORD=
このファイルは、GORM を使用してデータベース接続を設定します。これは、アプリケーションで後で使用するデータベース接続インスタンスを保持するグローバル変数 DB を宣言します。
package config import ( "fmt" "os" "github.com/joho/godotenv" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/schema" ) var DB *gorm.DB func SetupDatabase() { godotenv.Load() connection := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_DATABASE")) db, _ := gorm.Open(mysql.Open(connection), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}}) DB = db }
このファイルは、Gin Web アプリケーションのルーティングを設定します。ルーターを初期化し、ルート URL で静的なindex.html ファイルを提供し、CRUD 操作の API ルートを定義します。
package router import ( "app/controllers" "github.com/gin-gonic/gin" ) func SetupRouter() { productController := controllers.ProductController{} router := gin.Default() router.StaticFile("/", "./public/index.html") router.Group("/api"). GET("/products", productController.Index). POST("/products", productController.Create). GET("/products/:id", productController.Get). PUT("/products/:id", productController.Update). DELETE("/products/:id", productController.Delete) router.Run() }
このファイルは、アプリケーションの製品モデルを定義します。このモデルは、製品に関連するデータベース操作に使用されます。
package models type Product struct { Id int `gorm:"primaryKey;autoIncrement"` Name string Price float64 }
このファイルは、受信リクエストを処理し、CRUD 操作を実行するために必要なすべての関数を定義します。
package controllers import ( "app/config" "app/models" "net/http" "strconv" "github.com/gin-gonic/gin" ) type ProductController struct { } func (con *ProductController) Index(c *gin.Context) { var products []models.Product config.DB.Find(&products) c.JSON(http.StatusOK, products) } func (con *ProductController) Get(c *gin.Context) { var product models.Product config.DB.First(&product, c.Params.ByName("id")) c.JSON(http.StatusOK, product) } func (con *ProductController) Create(c *gin.Context) { var product models.Product c.BindJSON(&product) if err := config.DB.Create(&product).Error; err != nil { c.AbortWithError(http.StatusBadRequest, err) return } c.JSON(http.StatusOK, product) } func (con *ProductController) Update(c *gin.Context) { var product models.Product c.BindJSON(&product) product.Id, _ = strconv.Atoi(c.Params.ByName("id")) if err := config.DB.Updates(&product).Error; err != nil { c.AbortWithError(http.StatusBadRequest, err) return } c.JSON(http.StatusOK, product) } func (con *ProductController) Delete(c *gin.Context) { var product models.Product if err := config.DB.Delete(&product, c.Params.ByName("id")).Error; err != nil { c.AbortWithError(http.StatusBadRequest, err) return } c.Status(http.StatusOK) }
c.BindJSON() は、JSON ペイロードをリクエスト本文から Go 構造体に解析します。
config.DB 目的のデータベース操作を実行するために使用する GORM インスタンス。
c.JSON() は、操作の結果と適切な HTTP ステータス コードを含む JSON 応答を送信します。
このファイルは、アプリケーションのメインのエントリ ポイントです。これにより、Gin Web アプリケーションが作成および設定されます。
package main import ( "app/config" "app/router" ) func main() { config.SetupDatabase() router.SetupRouter() }
このファイルは、API をテストするための基本的なユーザー インターフェイスを作成するために使用されます。
<!DOCTYPE html> <head> <style> li { margin-bottom: 5px; } textarea { width: 100%; } </style> </head> <body> <h1>Example CRUD</h1> <ul> <li><button onclick="getProducts()">Get Products</button></li> <li><button onclick="getProduct()">Get Product</button></li> <li><button onclick="createProduct()">Create Product</button></li> <li><button onclick="updateProduct()">Update Product</button></li> <li><button onclick="deleteProduct()">Delete Product</button></li> </ul> <textarea id="text_response" rows="20"></textarea> <script> function showResponse(res) { res.text().then(text => { let contentType = res.headers.get('content-type') if (contentType && contentType.startsWith('application/json')) { text = JSON.stringify(JSON.parse(text), null, 4) } document.getElementById('text_response').innerHTML = text }) } function getProducts() { fetch('/api/products').then(showResponse) } function getProduct() { let id = prompt('Input product id') fetch('/api/products/' + id).then(showResponse) } function createProduct() { let name = prompt('Input product name') let price = parseFloat(prompt('Input product price')) fetch('/api/products', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, price }) }).then(showResponse) } function updateProduct() { let id = parseInt(prompt('Input product id to update')) let name = prompt('Input new product name') let price = parseFloat(prompt('Input new product price')) fetch('/api/products/' + id, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, price }) }).then(showResponse) } function deleteProduct() { let id = prompt('Input product id to delete') fetch('/api/products/' + id, { method: 'DELETE' }).then(showResponse) } </script> </body> </html>
go run main.go
Web ブラウザを開いて http://localhost:8080 に移動します
「製品を入手」ボタンをクリックします。 API はすべての商品データを返します。
「製品を取得」ボタンをクリックし、製品 ID に「1」を入力します。 API は商品データを返します。
「製品の作成」ボタンをクリックし、製品名に「test-create」、価格に「100」と入力します。 API は新しく作成された製品を返します。
「製品の更新」ボタンをクリックし、製品 ID に「101」、名前に「test-update」、価格に「200」を入力します。 API は更新された製品を返します。
「製品を削除」ボタンをクリックし、製品 ID に「101」を入力します。 API は何も返しませんが、API からは何も返さないため、これは許容されます。
この記事では、CRUD API を作成するために、Gin フレームワークを作成および設定する方法を学習しました。 GORM を ORM として利用して、データベースに対して CRUD 操作を実行します。 JavaScript を使用して API をテストします。記事をお楽しみいただければ幸いです。
ソースコード: https://github.com/StackPuz/Example-CRUD-Go
CRUD Web アプリを作成します: https://stackpuz.com
以上がGo で CRUD API を作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。