上一篇文章,我们完成了基础环境的搭建,并通过viper完成了配置文件的读取,本章,我们将要完成使用gorm连接数据库,并插入一条数据
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
然后,增加setupDBEngine()方法来实例化DBEngine,代码如下:
func setupDBEngine() {
var err error
DBEngine, err = config.NewDBEngine(DbConfig)
if err != nil {
log.Panic("config.NewDBEngine error : ", err)
}
}
最后,在init()方法里,增加对setupDBEngine()方法的调用,完整代码如下:
package global
import (
"go-chain-data/config"
"go-chain-data/config/setting"
"gorm.io/gorm"
"log"
)
var (
DbConfig *setting.DbConfig
BlockChainConfig *setting.BlockChainConfig
DBEngine *gorm.DB
)
func init() {
setupConfig()
setupDBEngine()
}
func setupConfig() {
conf, err := config.NewConfig()
if err != nil {
log.Panic("config2.NewConfig error : ", err)
}
err = conf.ReadSection("Database", &DbConfig)
if err != nil {
log.Panic("ReadSection - Database error : ", err)
}
err = conf.ReadSection("BlockChain", &BlockChainConfig)
if err != nil {
log.Panic("ReadSection - BlockChain error : ", err)
}
}
func setupDBEngine() {
var err error
DBEngine, err = config.NewDBEngine(DbConfig)
if err != nil {
log.Panic("config.NewDBEngine error : ", err)
}
}
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、测试数据库连接
3.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获取链上数据” 领取完整代码