【使用go开发区块链】之获取链上数据(02)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外柏叁布道者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值