3

从零开发区块链应用(三)--mysql初始化及gorm框架使用

 2 years ago
source link: https://learnblockchain.cn/article/3448
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

从零开发区块链应用(三)--mysql初始化及gorm框架使用

mysql初始化及gorm框架使用

一、mysql初始化

1.1 导入依赖包

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"github.com/moba/moba/config"
	"github.com/moba/moba/pkg/go-logger"
	"time"
)

1.2 连接数据库

var err error
// 创建连接池
//DB, err = sql.Open("mysql", config.Conf.Mysql.SourceName)
user := config.Conf.Mysql.User
password := config.Conf.Mysql.Password
host := config.Conf.Mysql.Host
port := config.Conf.Mysql.Port
database := config.Conf.Mysql.Database
DB, err = sql.Open("mysql", user+":"+password+"@tcp("+host+":"+port+")/"+database+"?parseTime=true&charset=utf8&loc=Local")
if err != nil {
	logger.Error(err.Error())
}

1.3 设置连接数

DB.SetMaxIdleConns(20)
DB.SetMaxOpenConns(20)
DB.SetConnMaxLifetime(time.Minute * 10)

1.4 测试数据库是否可以连接成功

err = DB.Ping()
if err != nil {
	logger.Error("MySQL connection failed.", "err", err.Error())
} else {
	logger.Info("MySQL connection successful!")
}

二、gorm框架使用

Gorm是golang的一个orm框架,它提供了对数据库操作的封装,使用起来相当便利。 所以如果对mysql使用操作不熟悉,建议也可以使用gorm框架操作mysql数据库。

2.1 gorm库安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

2.2 数据库连接

//数据库连接
var err error

dsn := "root:AXCyDF5jV4FWcAJyV4FN@tcp(IP地址:port)/nft?charset=utf8&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
	NamingStrategy: schema.NamingStrategy{
		SingularTable: true,  //使用单数表名,启用该选项后,`User` 表将是`user`
	},
	//Logger: logger.Default.LogMode(logger.Silent), //打印详细日志,可在代码测试时关闭,打开后为静默输出
})

连接比较简单,直接调用 gorm.Open 传入数据库地址即可。gorm支持基本上所有主流的关系数据库,只是连接方式上略有不同,这里使用 mysql为例

2.3 表数据插入

  • 表结构体定义
type Banner struct {
	ID         int       `gorm:"primary_key"`
	ImageUrl   string    `gorm:"type:varchar(255);"`
	JumpUrl    string    `gorm:"type:varchar(255);"`
	Order      int       `gorm:"int(10)"`
	Status     int       `gorm:"type:tinyint(1);"`
	CreateTime time.Time `gorm:"type:datetime;"`
	UpdateTime time.Time `gorm:"type:datetime;"`
}
  • 表数据插入
banner := Banner{
		ImageUrl:   "http://imageurl.lijie.com",
		JumpUrl:    "http://jumpurl.lijie.com",
		Order:      1,
		Status:     1,
		CreateTime: time.Now(),
		UpdateTime: time.Now(),
	}
	db.Table("banner").Create(&banner) // 通过数据的指针来创建

构造已给对象,直接调用 db.Create() 就可以插入一条记录。不用拼接sql语句,可以说非常方便了。

2.4 表数据查询

  • 根据主键ID进行查询
var banner Banner
db.Table("banner").First(&banner, 1)
fmt.Println(banner)
  • 获取所有数据
var array []Banner
db.Table("banner").Find(&array)
fmt.Println(array)

注:Find查询结果是列表,First查询的是单条数据。Find方法与First的逻辑很像,First增加了一个Limit(1), 而Find没有

  • 获取一条数据
var array []Banner
db.Table("banner").Limit(1).Find(&array)
fmt.Println(array)
  • 获取多个条件的并集
var array []Banner
db.Table("banner").Where("id = ?", "1").Or(db.Where("id = ?", "2"),).Find(&array)
fmt.Println(array)
var array []Banner
db.Table("banner").Where("image_url like ?", "%lijie%").Find(&array)
fmt.Println( array)
  • 多条件查询
var array []Banner
db.Table("banner").Where("id = ?", "1").Where("image_url like ?", "%lijie%").Find(&array)
fmt.Println(array)

2.5 表数据更新

  • 根据条件进行更新单个字段
db.Table("banner").Where("id = ?", 1).Update("image_url", "http://baidu.com")
db.Model(&Banner{}).Where("id = ?", 1).Update("image_url", "http://JD.com")
  • 根据条件更新多个字段
db.Table("banner").Where("id = ?", 2).Updates(Banner{ImageUrl: "http://baidu.com", JumpUrl: "http://qq.com"})
db.Model(&Banner{}).Where("id = ?", 1).Updates(Banner{ImageUrl: "http://baidu.com", JumpUrl: "http://qq.com"})
  • 选定某些字段更新
db.Table("banner").Where("id = ?", "3").Select("ImageUrl").Updates(Banner{ImageUrl: "http://badui.com", JumpUrl: "http://badui.com", Status: 1})
db.Model(&Banner{}).Where("id = ?", "3").Select("ImageUrl").Updates(Banner{ImageUrl: "http://badui.com", JumpUrl: "http://badui.com", Status: 1})
  • 忽略某些字段更新
db.Table("banner").Where("id = ?", "3").Omit("ImageUrl").Updates(Banner{ImageUrl: "http://badui.com", JumpUrl: "http://badui.com", Status: 1})

对应sql语句:UPDATE banner SET jump_url='http://badui.com',status=1 WHERE id = '3'

db.Model(&Banner{}).Where("id = ?", "3").Omit("JumpUrl", "Status").Updates(Banner{ImageUrl: "http://badui.com", JumpUrl: "http://badui.com", Status: 1})

对应sql语句:UPDATE banner SET image_url='http://badui.com' WHERE id = '3'

2.6 表数据删除

  • 删除符合条件的数据

Delete中必须传参一个对象

db.Table("banner").Where("status = ?", "0").Delete(&Banner{})

对应sql语句:DELETE FROM banner WHERE status = '0'

  • 根据表中主键删除数据
db.Table("banner").Delete(&Banner{}, 2)

对应sql语句:DELETE FROM banner WHERE banner.id = 2


本系列文章:
从零开发区块链应用(一)--golang配置文件管理工具viper
从零开发区块链应用(二)--mysql安装及数据库表的安装创建
从零开发区块链应用(三)--mysql初始化及gorm框架使用
从零开发区块链应用(四)--自定义业务错误信息


本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 1天前
  • 阅读 ( 68 )
  • 学分 ( 3 )
  • 分类:DApp

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK