ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Golang ORM 快速入门教程

2022-06-22 18:00:06  阅读:203  来源: 互联网

标签:http name err 入门教程 db Golang ORM User user


ORM(Object Relationship Managers) 作为开发者与底层数据库技术之间的代理。它本质上让我们使用对象,就像我们通常会做的那样,而不必编写复杂的SQL语句。利用ORM可以在与数据库交互时有效减少编码复杂度。

环境准备与示例说明

创建一个项目,项目名:go-orm-demo1

安装GORM库

我们使用go get命令安装jinzhu/gorm:

 go get -u github.com/jinzhu/gorm

正确安装后即可以在项目中引入jinzhu/gorm。

简单示例说明

下面我们搭建一个简单的web应用,通过REST API对用户信息(名称、邮箱)管理。首先描述go User struct:

package model

import "github.com/jinzhu/gorm"

type User struct {
	gorm.Model
	Name  string
	Email string
}

我们定义了User实体模型,下面暴露API接口与SQLITE数据库交互,实现用户记录保存、修改、删除、查询服务。

API接口

现在我们创建简单API接口实现CRUD功能,利用gorilla/mux可以快速定义服务接口以及对应处理方法:

package main

import (
	"fmt"
	"github.com/gorilla/mux"
	"log"
	"net/http"
)

func home(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("GORM 教程"))
}

func allUsers(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "All Users Endpoint Hit")
}

func newUser(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "New User Endpoint Hit")
}

func deleteUser(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Delete User Endpoint Hit")
}

func updateUser(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Update User Endpoint Hit")
}

// 定义路由及请求处理函数
func handleRequests() {
	myRouter := mux.NewRouter().StrictSlash(true)

	myRouter.HandleFunc("/", home).Methods("GET")
	myRouter.HandleFunc("/users", allUsers).Methods("GET")
	myRouter.HandleFunc("/user/{name}", deleteUser).Methods("DELETE")
	myRouter.HandleFunc("/user/{name}/{email}", updateUser).Methods("PUT")
	myRouter.HandleFunc("/user/{name}/{email}", newUser).Methods("POST")

	log.Fatal(http.ListenAndServe(":8081", myRouter))
}

func main() {
	fmt.Println("Go ORM 教程")

	// 处理请求地址
	handleRequests()
}

MySQL 数据库交互

初始化Schema

开启mysql连接

主要用到gorm.open()这个方法

package db

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

//参数含义:数据库用户名、密码、主机ip、连接的数据库、端口号
func dbConn(User, Password, Host, Db string, Port int) (*gorm.DB, error) {
	connArgs := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", User, Password, Host, Port, Db)
	db, err := gorm.Open("mysql", connArgs)
	if err != nil {
		return nil, err
	}
	db.SingularTable(true) //如果使用gorm来帮忙创建表时,这里填写false的话gorm会给表添加s后缀,填写true则不会
	db.LogMode(true)       //打印sql语句
	//开启连接池
	db.DB().SetMaxIdleConns(100)   //最大空闲连接
	db.DB().SetMaxOpenConns(10000) //最大连接数
	db.DB().SetConnMaxLifetime(30) //最大生存时间(s)

	return db, err
}

func GetDb() (conn *gorm.DB, err error) {
	i := 1
	for i <= 100 {
		conn, err = dbConn("root", "123456", "127.0.0.1", "go", 3306)
		if conn != nil {
			break
		}
		i++
		fmt.Println("本次未获取到mysql连接")
	}
	return conn, err
}

注意:

当报错:

sql: unknown driver "mysql" (forgotten import?)

需要倒入mysql driver:_ "github.com/jinzhu/gorm/dialects/mysql"

GORM通过调用db.AutoMigrate(&User{})可以自动创建User表,大大节省了写创建表语句:

func main() {
	fmt.Println("Go ORM 教程")

	// 增加调用初始化函数
	initialMigration()

	// 处理请求地址
	handleRequests()
}

// 初始化数据库、创建表
func initialMigration() {
	db, err := db.GetDb()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer db.Close()
	// 创建User表
	db.AutoMigrate(&model.User{})
}

上面代码首先定义初始化函数创建数据库及User表,然后在main函数中调用实现数据库初始化。准备好之后我们开始实现CRUD的具体逻辑

新增用户

现在更新newUser()函数代码,假如插入用户代码。我们需要从请求路径参数中解析出username、email,然后填充User对象。最后调用 db.Create(&User{Name: name, Email: email}) 插入sqlite数据库User表:

func newUser(w http.ResponseWriter, r *http.Request) {
	fmt.Println("New User Endpoint Hit")
	db, err := db.GetDb()
	if err != nil {
		panic("failed to connect database")
	}
	defer db.Close()

	vars := mux.Vars(r)
	name := vars["name"]
	email := vars["email"]

	db.Create(&model.User{Name: name, Email: email})
	fmt.Fprintf(w, "New User Successfully Created")
}

http://127.0.0.1:8081/user/laowan/1883

运行结果:

修改用户

使用GORM可以轻松更新数据库记录,仅需要通过name查询到需要更新的用户,更新邮箱属性信息,最后调用db.Save(&user)持久化对象至数据库。

		db, err := db.GetDb()
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    vars := mux.Vars(r)
    name := vars["name"]
    email := vars["email"]

    var user User
    db.Where("name = ?", name).Find(&user)

    user.Email = email

    db.Save(&user)
    fmt.Fprintf(w, "Successfully Updated User")

http://127.0.0.1:8081/user/laowan/188344

运行结果:

删除用户

deleteUser 函数删除匹配name路径参数值的数据库记录。

func deleteUser(w http.ResponseWriter, r *http.Request) {
	db, err := db.GetDb()
	if err != nil {
		panic("failed to connect database")
	}
	defer db.Close()
	vars := mux.Vars(r)
	name := vars["name"]
	var user model.User
	db.Where("name = ?", name).Find(&user)
	db.Delete(&user)

	fmt.Fprintf(w, "Successfully Deleted User")
}

http://127.0.0.1:8081/user/laowan

运行结果:

查询用户

allUsers() 函数查询所有用户记录,然后编码为json作为响应返回

func deleteUser(w http.ResponseWriter, r *http.Request) {
	db, err := db.GetDb()
	if err != nil {
		panic("failed to connect database")
	}
	defer db.Close()
	vars := mux.Vars(r)
	name := vars["name"]
	var user model.User
	db.Where("name = ?", name).Find(&user)
	db.Delete(&user)

	fmt.Fprintf(w, "Successfully Deleted User")
}

http://127.0.0.1:8081/users

运行结果:

总结

本文通过简单示例展示了GORM的使用,并通过gorilla/mux快速搭建WEB版用户信息管理

原文转载于:https://blog.csdn.net/neweastsun/article/details/123595746

标签:http,name,err,入门教程,db,Golang,ORM,User,user
来源: https://www.cnblogs.com/java5wanping/p/16401580.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有