0.序文
本連載で使用した開発環境は以下のとおりです。
- ゴーランド
- 1.17.1に行く
このセクションでは、まずプロジェクトで gin フレームワークのインポートを完了し、テスト用の helleworld を作成し、次に gorm パッケージをインポートし、gorm と gin を組み合わせて簡単な登録ロジックを開発しました。
1. 作業ディレクトリを作成する
goland で gin_test プロジェクトを作成し、main.go ファイルを作成します。
2. GIN フレームワークをインストールしてテストする
2.1 gin パッケージをインストールする
前のセクションで作成した gin_test ディレクトリに移動し、次のコマンドを入力します。
go get -u github.com/gin-gonic/gin
パッケージがブロックされているため、ここでタイムアウト エラーが発生する可能性があることに注意してください。この問題を解決するために GO 環境を構成できます。詳細については、ブロガーの他の記事 go moduleconfiguration を参照してください。
インストール後、go.mod に多くの gin 依存関係が表示されます。
2.2 テスト用に helloworld を作成する
main.go ファイルに次のコードを入力します。
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
実行後、http://localhost:8080/ping と入力して Pong メッセージを確認します。
3. gorm パッケージをインストールしてテストする
gin_test ディレクトリで次のコマンドを実行します。
go get -u gorm.io/gorm
ここでは mysql を使用しているため、次のパッケージも含める必要があります。
go get gorm.io/driver/mysql
テスト用に次の単純なコードを作成しました。このコードは、データベース内のテーブルにマップされるユーザー構造を定義し、追加、削除、変更、およびクエリ操作がこのテーブルに基づいて実行されます。
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
//定义结构体到数据库的映射,设置name为非空且唯一
type User struct {
gorm.Model
Name string `gorm:"not null;unique"`
Telephone string
Password string
}
func main() {
db:=InitDb()
//自动创建数据表
db.AutoMigrate(&User{})
db.Create(&User{Name: "yzy",
Password: "123456"})
var user User
fmt.Print(user)
fmt.Printf("----------\n")
db.First(&user,"name=?","yzy")
fmt.Print(user)
fmt.Printf("----------\n")
}
func InitDb() *gorm.DB{
//一些数据库的参数
username:="root"
password:="123456"
host:="localhost"
port:="3306"
charset:="utf8"
database:="test" //使用test数据库
dns:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
username,
password,
host,
port,
database,
charset)
//后面还可以传入一些对数据库特殊的定义
db,err:=gorm.Open(mysql.Open(dns))
if err != nil {
panic("failed to connect database,err:"+err.Error())
}
return db
}
実行する前に、データベース サービスを開始し、コードで指定されたデータベースを作成することを忘れないでください。
net start mysql
//进入mysql
mysql -u root -p
//创建数据库
creat database test
実行後にデータベースにクエリを実行する
select * from users;
4. 登録ロジックの作成
コードは以下のように表示されます。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
gorm.Model
Name string
Telephone string `gorm:"unique;not null"`
Password string `gorm:"not null"`
}
func main(){
db:=InitDb()
db.AutoMigrate(&User{})
router:=gin.Default()
router.GET("/register",Register)
router.Run()
}
func Register(c *gin.Context){
db:=InitDb()
//获取数据
name:=c.Query("name")
password:=c.Query("password")
telephone:=c.Query("telephone")
if len(telephone)!=11{
c.JSON(400,gin.H{
"error":"the telephone is not correct",
})
return
}
//判断
if isTelephoneExist(db,telephone){
c.JSON(400,gin.H{
"error":"the telephone is already exit",
})
return
}
//插入数据
db.Create(&User{Name: name,Password: password,Telephone: telephone})
c.JSON(200,gin.H{
"msg":"succeed",
})
return
}
func isTelephoneExist(db *gorm.DB,telephone string)bool{
var user User
db.Where("password=?",telephone).First(&user)
if user.ID!=0{
return true
}else{
return false
}
}
func InitDb()*gorm.DB{
username:="root"
password:="123456"
database:="gin_demo"
charset:="utf8"
port:="3306"
host:="localhost"
dns:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True",
username,
password,
host,
port,
database,
charset)
db,err:=gorm.Open(mysql.Open(dns))
if err != nil {
panic("can't connect to the mysql"+err.Error())
}
return db
}
6. まとめ
今回実装した小規模なデモはすべての機能が 1 つのパッケージに書かれていますが、ビジネスが拡大すると、次にプロジェクトのアーキテクチャを再設計するため、このようなアーキテクチャは非常に肥大化して保守が困難になります。