上一篇文章,我们完成了基础环境的搭建,并通过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获取链上数据” 领取完整代码