golang操作数据库--gorm框架、redis

这篇具有很好参考价值的文章主要介绍了golang操作数据库--gorm框架、redis。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.数据库相关操作

(1)非orm框架

①引入

go get github.com/go-sql-driver/mysql

②初始化

import (
	"database/sql"
	"fmt"

	"github.com/Project02/utils"
	_ "github.com/go-sql-driver/mysql"
)

func InitDB() (err error) {
	// DSN:Data Source Name
	dsn := "root:991113@tcp(127.0.0.1:3306)/chuangyitest?charset=utf8mb4&parseTime=True"
	// 不会校验账号密码是否正确
	// 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量db
	MyDB, err = sql.Open("mysql", dsn)
	if err != nil {
		fmt.Println(fmt.Sprintf("database open err, err=%s", utils.GetLogStr(err)))
		return
	}
	// 尝试与数据库建立连接(校验dsn是否正确)
	err = MyDB.Ping()
	if err != nil {
		fmt.Println(fmt.Sprintf("database ping err, err=%s", utils.GetLogStr(err)))
		return
	}
	fmt.Println("建立链接成功...")
	return
}

③增删改查

// 查询数据示例
func queryRowDemo() {
	sqlStr := "select * from user_tag where id > ?"
	rows, err := caller.MyDB.Query(sqlStr, 250)
	if err != nil {
		fmt.Printf("query failed, err:%v\n", err)
		return
	}
	defer rows.Close()

	for rows.Next() {
		var ut UserTag
		err := rows.Scan(&ut.Id, &ut.Name, &ut.EntityId, &ut.TimeCreated)
		if err != nil {
			fmt.Printf("scan failed, err:%v\n", err)
			return
		}
		fmt.Printf("res=%s\n", utils.GetLogStr(ut))
	}
}

// 插入数据
func insertRowDemo() {
	sqlStr := "insert into user_tag(name, entity_id, time_created) values (?,?,?)"
	nowTime := time.Now().Format("2006-01-02 15:04:05")
	ret, err := caller.MyDB.Exec(sqlStr, "王五", 2, nowTime)
	if err != nil {
		fmt.Printf("insert failed, err:%v\n", err)
		return
	}
	theID, err := ret.LastInsertId() // 新插入数据的id
	if err != nil {
		fmt.Printf("get lastinsert ID failed, err:%v\n", err)
		return
	}
	fmt.Printf("insert success, the id is %d.\n", theID)
}

// 更新数据
func updateRowDemo() {
	sqlStr := "update user_tag set time_created=? where id = ?"
	nowTime := time.Now().Format("2006-01-02 15:04:05")
	ret, err := caller.MyDB.Exec(sqlStr, nowTime, 259)
	if err != nil {
		fmt.Printf("update failed, err:%v\n", err)
		return
	}
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("update success, affected rows:%d\n", n)
}

// 删除数据
func deleteRowDemo() {
	sqlStr := "delete from user_tag where id = ?"
	ret, err := caller.MyDB.Exec(sqlStr, 3)
	if err != nil {
		fmt.Printf("delete failed, err:%v\n", err)
		return
	}
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("delete success, affected rows:%d\n", n)
}

(2) io版orm框架 (推荐用这个)

官网: http://gorm.io/

①引入

go get gorm.io/driver/mysql
go get gorm.io/gorm

②初始化

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var (
	MyDB *gorm.DB
)

func Init() {
	// 初始化数据库
	InitDB()
}

func InitDB() {
	MyDB = InitDBDetail("root", "123456", "lyhtest", "127.0.0.1", 3306)

    fmt.Println("success...")
	return
}

func InitDBDetail(username, password, dbname, ip string, port int64) *gorm.DB {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, ip, port, dbname)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	return db
}

③增删改查

说明:Debug()可以查看执行的sql语句。

// 增
func createDemo() {
	userTag := UserTag{
		Name:     "java",
		EntityId: 2,
	}
	caller.MyDB.Debug().Table("user_tag").Create(&userTag)
    // 新增的主键
	fmt.Println(utils.GetLogStr(userTag.Id))
}

// 改
func updateDemo() {
	userTag := UserTag{
		Name: "玩耍2",
	}
	aa := caller.MyDB.Debug().Table("user_tag").Where("id=?", 259).Updates(&userTag) // 注意是Updates
	fmt.Println(utils.GetLogStr(aa))
}

// 查
func queryDemo() {
	userTagList := make([]UserTag, 0)
	caller.MyDB.Debug().Table("user_tag").Where("id = ?", 259).Find(&userTagList)
	fmt.Println(utils.GetLogStr(userTagList))
}

④gorm gen的使用

a.先安装(会安装到gopath的bin目录下,windows电脑,需要将该路径加入到系统路径)

go install gorm.io/gen/tools/gentool@latest
gentool -h

Usage of gentool:
 -c string
       config file path  配置文件路径
 -db string
       input mysql or postgres or sqlite or sqlserver. consult[https://gorm.io/docs/connecting_to_the_database.html] (default "mysql")
 -dsn string
       consult[https://gorm.io/docs/connecting_to_the_database.html]
 -fieldNullable
       generate with pointer when field is nullable
 -fieldWithIndexTag
       generate field with gorm index tag
 -fieldWithTypeTag
       generate field with gorm column type tag
 -modelPkgName string
       generated model code's package name  {生成结构体的路径}
 -outFile string
       query code file name, default: gen.go
 -outPath string
       specify a directory for output (default "./dao/query")   {生成query的路径}
 -tables string
       enter the required data table or leave it blank
 -onlyModel
       only generate models (without query file)
 -withUnitTest
       generate unit test for query code
 -fieldSignable
       detect integer field's unsigned type, adjust generated data type

eg :

--tables="orders"       # generate from `orders`

--tables="orders,users" # generate from `orders` and `users`

--tables=""             # generate from all tables 这样是全部的表名

b.举例:
说明1:windows电脑go install之后,把exe添加到系统路径,然后最好使用cmd运行, 先进入到项目目录,执行下面的命令(如果提示没有gcc命令,需要先安装该命令)
说明2:-modelPkgName属性是在-outPath路径的上一级目录的基础上的

gentool -dsn "root:991113@tcp(127.0.0.1:3306)/chuangyitest?charset=utf8&parseTime=True&loc=Local" -tables ""  -outPath "./dal/query" -modelPkgName "./models"

生成的项目结构为:

project
	dal
		models
		query

(3) jinzhu版orm框架

官网: https://pkg.go.dev/github.com/jinzhu/gorm#Open

①引入

go get github.com/go-sql-driver/mysql
go get -u github.com/jinzhu/gorm

②初始化

package caller

import (
	"fmt"

	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"liuyaohui.lyh/Project03/utils"
)

var (
	MyDB *gorm.DB
)

func Init() {
	// 初始化数据库
	if err := InitDB(); err != nil {
		fmt.Println(fmt.Sprintf("database err, err=%s", utils.GetLogStr(err)))
	}
}

func InitDB() (err error) {
	MyDB, err = gorm.Open("mysql", "root:991113@tcp(127.0.0.1:3306)/chuangyitest?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		fmt.Println(fmt.Sprintf("database open err, err=%s", utils.GetLogStr(err)))
		return
	}
	fmt.Println("database success...")
	return
}

③增删改查

// 增
func MyInsert() {
	caller.MyDB.Table("user_tag").Create(&UserTag{Name: "ik01001", EntityId: 2})
}

// 查
func myQuery() {
	var userTag UserTag
	caller.MyDB.Table("user_tag").First(&userTag, "id = ?", 259) // 查询code为259的userTag
	fmt.Printf("%s\n", utils.GetLogStr(userTag))

	userTagList := make([]UserTag, 0)
	caller.MyDB.Table("user_tag").Find(&userTagList, "id > ?", 257)
	fmt.Printf("%s\n", utils.GetLogStr(userTagList))
}

// 事务
func myTx() error {
	// 注意,一旦你在一个事务中,使用tx作为数据库句柄
	tx := caller.MyDB.Table("user_tag").Begin()
	// 注意:where一定要在更新操作前面,不然会数据全部更新
	// 方式1
	if err := tx.Where(map[string]interface{}{"id": 259}).Update(&UserTag{Name: "玩耍2"}).Error; err != nil {
		tx.Rollback()
		return err
	}
	// 方式2
	if err := tx.Where("id=?", 259).Update(&UserTag{Name: "玩耍333"}).Error; err != nil {
		tx.Rollback()
		return err
	}
	tx.Commit()
	return nil
}

2.redis

网址:https://liwenzhou.com/posts/Go/go_redis/文章来源地址https://www.toymoban.com/news/detail-694802.html

(1)引入

go get -u github.com/go-redis/redis

(2)初始化

①普通初始化

// 声明一个全局的rdb变量
var rdb *redis.Client

// 初始化连接
func initClient() (err error) {
	rdb = redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // no password set
		DB:       0,  // use default DB
	})

	_, err = rdb.Ping().Result()
	if err != nil {
		return err
	}
	return nil
}

②v8初始化

import (
	"context"
	"fmt"
	"time"

	"github.com/go-redis/redis/v8" // 注意导入的是新版本
)

var (
	rdb *redis.Client
)

// 初始化连接
func initClient() (err error) {
	rdb = redis.NewClient(&redis.Options{
		Addr:     "localhost:16379",
		Password: "",  // no password set
		DB:       0,   // use default DB
		PoolSize: 100, // 连接池大小
	})

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	_, err = rdb.Ping(ctx).Result()
	return err
}

③get/set示例

func redisExample() {
	err := rdb.Set("score", 100, 0).Err()
	if err != nil {
		fmt.Printf("set score failed, err:%v\n", err)
		return
	}

	val, err := rdb.Get("score").Result()
	if err != nil {
		fmt.Printf("get score failed, err:%v\n", err)
		return
	}
	fmt.Println("score", val)

	val2, err := rdb.Get("name").Result()
	if err == redis.Nil {
		fmt.Println("name does not exist")
	} else if err != nil {
		fmt.Printf("get name failed, err:%v\n", err)
		return
	} else {
		fmt.Println("name", val2)
	}
}

到了这里,关于golang操作数据库--gorm框架、redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开源 Golang 微服务入门三:ORM 框架 GORM

    前两篇笔记分别介绍了 Golang 微服务 HTTP 框架 Hertz 和 Golang 微服务 RPC 框架 Kitex,本文将要介绍面向ORM(持久层)框架 GORM。 官方文档 GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开

    2024年02月14日
    浏览(37)
  • Python 进阶(三):Python使用ORM框架SQLAlchemy操作Oracle数据库

    要详细连接Oracle数据库并使用SQLAlchemy进行操作,按照以下步骤进行配置和编写代码: Oracle Instant Client:Oracle 提供的客户端库,可用于在 Python 中连接和操作 Oracle 数据库 访问 Oracle 官方网站:前往 Oracle 官方网站(instant-client/winx64-64-downloads) 可能需要创建一个免费的 Oracle

    2024年02月11日
    浏览(49)
  • 基于SqlSugar的开发框架循序渐进介绍(27)-- 基于MongoDB的数据库操作整合

    SqlSugar的开发框架本身主要是基于常规关系型数据库设计的框架,支持多种数据库类型的接入,如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等数据库,非关系型数据库的MongoDB数据库也可以作为扩展整合到开发框架里面,通过基类的继承关系很好的封装了相关的基础操作功能,极大

    2023年04月13日
    浏览(47)
  • Golang通过Gorm操作Mysql时遇到的datetime时区问题

    golang使用Gorm操作MySQL,MySQL中数据类型是datetime,Golang中用的是time.now。 但是会导致存储的时间与北京时间有8h误差, 显然是没有初始化时区导致。 参考我自己之前写过的一篇总结——Mysql中多种日期类型——DATETIME、TIMESTAMP、TIME、YEAR、DATE的区分 datetime是给什么就存什么,

    2024年01月20日
    浏览(40)
  • 课程《JavaWeb基础框架程序设计》考试题下篇——数据库与表单操作用题(人事管理平台的添加员工档案信息的操作题)

    这篇文章是大学课程《JavaWeb基础框架程序设计》考试题目的内容,包括了原题和答案。题目只包括了三道编程题,分值为30分、30分和40分,这篇文章继上一篇(课程《JavaWeb基础框架程序设计》考试题上篇——基础应用题(计算应用、水仙花数)),介绍40分的那题,以及代码

    2024年02月04日
    浏览(62)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(93)
  • 【GORM框架】一文学会用gorm实现对单表的增删改查操作

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: GORM框架学习 近期目标: 写好专栏的每一篇文章 在上一篇Gorm文章中,我们学习了如何使用gorm进行数据库的连接和一些

    2024年02月03日
    浏览(93)
  • golang中给数据库datetime格式赋值

    1、定义数据库表映射结构体如上,create_time字段在表里面是datetime格式。 2、如果CreateTime不给值,在存库时,create_time字段的值为NULL。 3、赋值时,如下代码

    2024年02月09日
    浏览(49)
  • golang 连接 oracle 数据库 增删改查

     1,golang 连接 oracle 数据库  2,增删改查

    2024年02月09日
    浏览(51)
  • [Golang实战] gorm中使用Raw()和 Exec() 两种方式操作sql原生语句的特点和区别

    当我在gorm中使用原生sql操作数据库时,时常用raw() 和 exec() ,有时候经常遇到数据插不进去或者 数据帮i当不到结构体,原来是 这两个方法有不同的用处和特点 个人理解: 需要查询数据 映射到结构体时使用 官方理解: DB.Raw() 方法用于执行原始 SQL 查询语句或可执行的命令。

    2024年02月13日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包