【使用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表:

image.png

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()方法,控制台输出如下信息: image.png 我们查询一下数据库,发现数据已经插入进来了:

image.png

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

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

点赞 2
收藏 2
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
外柏叁布道者
外柏叁布道者
0x6ea1...9dbe
全网同名 资深区块链专家 更多web3、区块链技术与前沿信息 请关注公众号:外柏叁布道者(web3_preacher) Web3工具网站现已上线: https://utools.me 不定时更新各种实用工具,敬请关注 接各种Dapp、合约、web3相关工具开发