数据库接口

概述

我们整合 gorm,并抽象出 Dao 作为数据库交互工具:

// Dialect DAO database dialect
type Dialect interface {
	Init(...Option) error
	Options() Options
	NewTx() *DB
	Migrator() Migrator
	DataTypeOf(*schema.Field) string
	DefaultValueOf(*schema.Field) clause.Expression
	BindVarTo(writer clause.Writer, stmt *Statement, v interface{})
	QuoteTo(clause.Writer, string)
	Explain(sql string, vars ...interface{}) string
	JSONBuild(column string) JSONQuery
	JSONDataType() string
	String() string
}

使用

Dao 的接口语法和 gorm 兼容

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/vine-io/plugins/dao/mysql"
	"github.com/vine-io/vine/lib/dao"
	"github.com/vine-io/vine/lib/dao/logger"
)

type User struct {
	Id   int32  `dao:"column:id;autoIncrement;primaryKey"`
	Name string `dao:"column:name"`
	Age  int32  `dao:"column:age"`
}

func main() {
	dns := `root:123456@tcp(192.168.3.111:3306)/vine?charset=utf8&parseTime=True&loc=Local`
	dialect := mysql.NewDialect(dao.DSN(dns), dao.Logger(logger.New(logger.Options{
		SlowThreshold: 200 * time.Millisecond,
		LogLevel:      logger.Info,
	})))
    // 初始化
	if err := dialect.Init(); err != nil {
		log.Fatalln(err)
	}

    // 创建一个新的会话
	db := dialect.NewTx()

    // 更新表结构
	if err := db.AutoMigrate(&User{}); err != nil {
		log.Fatalln(err)
	}

	u := &User{Name: "Mimi", Age: 11}
    // 插入一条记录
	if err := db.Create(u).Error; err != nil {
		log.Fatalln(err)
	}

	u1 := &User{}
    // 查询
	if err := db.Find(&u1, "name = ?", "Mimi").Error; err != nil {
		log.Fatalln(err)
	}

	fmt.Println(u1)

	if err := db.Where("name = ?", "Mimi").First(&u1).Error; err != nil {
		log.Fatalln(err)
	}

	fmt.Println(u1)

	u1.Name = "Mimi_update"
    // 更新一条记录
	if err := db.Updates(u1).Error; err != nil {
		log.Fatalln(err)
	}

    // 删除一条记录
	if err := db.Delete(&User{}, "id = ?", 1).Error; err != nil {
		log.Fatalln(err)
	}
}

更多 CURD 的使用方式可以参考这里


最后修改 September 6, 2021: dao (42bf627)