淘先锋技术网

首页 1 2 3 4 5 6 7

上一篇文章,我们完成了基础环境的搭建,并通过viper完成了配置文件的读取,本章,我们将要完成使用gorm连接数据库,并插入一条数据

本系列文章
1、【使用go开发区块链】之获取链上数据(01)
2、【使用go开发区块链】之获取链上数据(02)
3、【使用go开发区块链】之获取链上数据(03)
4、【使用go开发区块链】之获取链上数据(04)

1、配置数据库连接

1.1、新建db.go

对数据库的操作,我们使用的是gorm类库,在终端输入下面命令安装gorm:

go get gorm.io/gorm
go get gorm.io/driver/mysql   #使用mysql驱动

在config目录下新建db.go,代码如下:

package config

import (
	"fmt"
	"go-chain-data/config/setting"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func NewDBEngine(dbConfig *setting.DbConfig) (*gorm.DB, error) {
	conn := "%s:%s@tcp(%s)/%s?charset=%s&parseTime=%t&loc=Local"
	dsn := fmt.Sprintf(conn, dbConfig.Username, dbConfig.Pwd, dbConfig.Host, dbConfig.DbName, dbConfig.Charset, dbConfig.ParseTime)
	db, err := gorm.Open(mysql.Open(dsn))
	if err != nil {
		return nil, err
	}
	return db, nil
}

NewDBEngine()方法创建了一个gorm.DB对象

这里需要注意的点是,gorm.io/driver/mysql 这个包 需要手动引入

1.2、修改global.go

增加DBEngine定义:

DBEngine         *gorm.DB

1.3、修改config.go

增加SetupDBEngine()方法来实例化DBEngine,代码如下:

func SetupDBEngine() {
    var err error
    global.DBEngine, err = NewDBEngine(global.DbConfig)
    if err != nil {
            log.Panic("NewDBEngine error : ", err)
    }
}

1.4、修改main.go

在init()方法里,增加对SetupDBEngine()方法的调用:

func init() {
    config.SetupConfig()
    config.SetupDBEngine()
}

2、编写实体类

2.1、新建block.go

首先,先在internal目录下创建models目录,然后,在models目录下新建block.go,代码如下:

package models

import (
	"go-chain-data/global"
	"gorm.io/gorm"
)

type Blocks struct {
	Id                int64  `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	BlockHeight       uint64 `json:"block_height" gorm:"column:block_height; default:0; comment:区块高度;"`
	BlockHash         string `json:"block_hash" gorm:"column:block_hash;default:''; comment:区块hash;"`
	ParentHash        string `json:"parent_hash" gorm:"column:parent_hash;default:''; comment:父hash;"`
	LatestBlockHeight uint64 `json:"latest_block_height" gorm:"column:latest_block_height;default: 0; comment:最后区块高度;"`
	*gorm.Model
}

func (b *Blocks) TableName() string {
	return "blocks"
}

func (b *Blocks) Insert() error {
	if err := global.DBEngine.Create(&b).Error; err != nil {
		return err
	}
	return nil
}

其中,TableName()方法是会在后面我们通过gorm映射创建数据库表的时候使用到(即该返回参数会被当作表的名字)
Insert()方法让我们可以插入一条新纪录

3、使用AutoMigrate创建表

3.1、修改db.go

gorm提供了一个方法AutoMigrate(),可以自动根据model创建/更新表结构,我们打开db.go,然后在最后面加上下面代码:

// MigrateDb 初始化数据库表
func MigrateDb() error {
    if err := global.DBEngine.AutoMigrate(&models.Blocks{}); err != nil {
            return err
    }
    return nil
}

其中models.Blocks表示我们需要gorm帮我们创建/更新的model对象,如果有多个,可以依次添加

3.2、修改main.go

在init()方法最后面,加上下面代码:

	err := config.MigrateDb()
	if err != nil {
		log.Panic("config.MigrateDb error : ", err)
	}

然后,我们执行 main.go里面的main()方法,打开数据库连接工具,发现gorm已经自动帮我们创建了blocks表:
在这里插入图片描述

4、测试数据库连接

4.1 测试插入

打开main.go,在main()方法里添加如下代码:

	block := models.Blocks{
		BlockHeight:       1,
		BlockHash:         "hash",
		ParentHash:        "parentHash",
		LatestBlockHeight: 2,
	}
	err := block.Insert()
	if err != nil {
		log.Panic("block.Insert error : ", err)
	}

然后运行main()方法,控制台输出如下信息:
在这里插入图片描述
我们查询一下数据库,发现数据已经插入进来了:
在这里插入图片描述

本章内容就到此结束了,在这一章里我们完成了数据库连接的创建,并成功插入了一条记录,接下来的课程,我们将要开始开发获取链上数据的功能,小伙伴们继续加油!

请关注公众号:外柏叁布道者(web3_preacher),回复 “go获取链上数据” 领取完整代码