gorm基本实践应用

106 阅读2分钟

基本介绍

gorm是go语言实现的orm库。它支持多种数据库并具有多种特性。

基本语法

创建模型

gorm创建一个基本的模型和其他的orm库没有什么不同,但是它使用的go独有的tag语法对模型作基本修饰。如果没有指定表名那么就会默认生成复数。

type User struct {
	ID       uint   `gorm:"primaryKey;autoIncrement"`
	Name     string `gorm:"column:name"`
	Password string `gorm:"column:password"`
}

func (u User) TableName() string {
	return "user"
}

上面这段代码指定了列名和表名并且指定ID为主键。需要注意的是如果要使用json序列化那么也要加上相应字段。

连接数据库

模型创建好之后就是最重要的连接数据库部分,gorm的数据库驱动由于实现方式不同可能要使用cgo在windows系统上面要编译以sqlite作为数据库的gorm程序需要安装mingw

var db *gorm.DB

func InitDb() {
	var err error
	db, err = gorm.Open(sqlite.Open("./user.sqlite"), &gorm.Config{})
	if err != nil {
		log.Fatal(err.Error())
	}
	db.AutoMigrate(&User{})
}

上面这段代码使用全局变量可以有效的服用一个实例不用重复多次连接。

增删查改

对于一个后端应用而言最为重要的无非就是增删查改的实现。在这里将使用一个 UserDao的结构体封装对应的操作

var userDao *UserDao
var userOnce sync.Once

// 使用单例模式减少额外开销提升性能
func NewUserDaoInstance() *UserDao {
	userOnce.Do(
		func() {
			userDao = &UserDao{}
		})
	return userDao
}
func (*UserDao) CreateUser(user *User) error {
	if err := db.Create(user).Error; err != nil {
		log.Println(err.Error())
		return err
	}
	return nil
}

func (*UserDao) UpdateUserByID(id uint, user User) error {
	if err := db.Model(&User{}).
		Where("ID=?", id).
		Updates(user).Error; err != nil {
		log.Println(err.Error())
		return err
	}
	return nil
}

func (*UserDao) DeleteUserByID(id uint) error {
	if err := db.Delete(&User{}, id).Error; err != nil {
		log.Println(err.Error())
		return err
	}
	return nil
}

func (*UserDao) GetUserByID(id uint) *User {
	var user User
	db.Find(&user, id)
	return &user
}

看上去简单的代码其实它就实现了基本的增删查改,其中更是利用了单例模式而且还是并发安全的。对于gorm而言其内部有sql的生成器所以它的语法看起就像sql一样。orm虽然方便但是也无法代替sql所以在写代码的时候不妨先想想sql是怎么写的。
例如根据ID查找用户

SELECT * FROM User Where ID=1

那么相应的gorm这样写也是可以的

db.Table("User").Where("ID=?",1).Find(&user{})

基本上对照着写就能实现基本的使用,不过对于这种简单而且高频率使用的代码是有更为简便的语法。

var user User
db.Find(&user, id)