服务计算|web服务端与客户端开发实战

项目github传送门:https://github.com/Cswapi
本次项目是仿造SWAPI网站制作,SWAPI网址:https://www.swapi.co/
此次数据库使用的是boltdb数据库。参考网址:https://github.com/boltdb/bolt

本次作业我在小组中负责的工作是数据库建立和提供数据库接口,而且将swapi网站所有数据resources全部存入数据库中。

 

数据库项目结构

DATABASE

——database

       --database.go

       --cswapi.db

——swapi

       --client.go

       --env_test.go

       --env.go

       --film.go

       --person.go

       --planet.go

       --species.go

       --starship.go

       --vehicle.go

——main.go

 

database.go是数据库接口

main.go是 数据库建立文件,通过官方的api接口,循环向swapi网站get请求获取数据,将数据存入桶中的键值。

swapi是官方接口

 

数据库主要接口


1.打开数据库

// 打开一个database
func Start(str string) {
	var err error
	dbName = str
	db, err = bolt.Open(dbName, 0666, &bolt.Options{Timeout: 1 * time.Second})
	if err != nil {
		log.Fatal(err)
		return
	}
}

2.关闭数据库

// 关闭database
func Stop() {
	if err := db.Close(); err != nil {
		log.Fatal(err)
	}
}

3.初始化数据库

// 初始化一个database
func Init(str string) {
	if _, err := os.Open(str); err == nil {
		log.Println("database is already exists!")
		return
	}
	Start(str)
	// 创建桶:键值对
	if err := db.Update(func(tx *bolt.Tx) error {
		tx.CreateBucket([]byte("users"))
		tx.CreateBucket([]byte("films"))
		tx.CreateBucket([]byte("people"))
		tx.CreateBucket([]byte("planets"))
		tx.CreateBucket([]byte("species"))
		tx.CreateBucket([]byte("starships"))
		tx.CreateBucket([]byte("vehicles"))
		return nil
	}); err != nil {
		log.Fatal(err)
	}
	Stop()
}

4.修改键值对

// 更新数据库内容
func Update(bucketName []byte, key []byte, value []byte) {
	if err := db.Update(func(tx *bolt.Tx) error {
		if err := tx.Bucket(bucketName).Put(key, value); err != nil {
			return err
		}
		return nil
	}); err != nil {
		log.Fatal(err)
	}
}

5.通过桶和键值获得value

// 通过桶名和键获得值
func GetValue(bucketName []byte, key []byte) string {
	var result []byte
	if err := db.View(func(tx *bolt.Tx) error {
		keyLen := len(tx.Bucket([]byte(bucketName)).Get(key))
		result = make([]byte, keyLen)
		copy(result[:], tx.Bucket([]byte(bucketName)).Get(key)[:])
		return nil
	}); err != nil {
		log.Fatal(err)
	}
	return string(result)
}

6.检查键

// 检查键是否正确
func CheckKey(bucketName []byte, key []byte) bool {
	// 键的字节数
	var keyLen int
	if err := db.View(func(tx *bolt.Tx) error {
		keyLen = len(tx.Bucket([]byte(bucketName)).Get(key))
		return nil
	}); err != nil {
		log.Fatal(err)
	}
	return (keyLen != 0)
}

7.获得桶的数量

// 获得桶的数量
func GetBucketCount(bucketName []byte) int {
	count := 0
	if err := db.View(func(tx *bolt.Tx) error {
		b := tx.Bucket([]byte(bucketName))
		c := b.Cursor()
		for k, _ := c.First(); k != nil; k, _ = c.Next() {
			count++
		}
		return nil
	}); err != nil {
		log.Fatal(err)
	}
	return count
}

8.检查桶

// 检查桶
func CheckBucket(bucketName []byte) {
	if err := db.View(func(tx *bolt.Tx) error {
		b := tx.Bucket([]byte(bucketName))
		c := b.Cursor()
		for k, v := c.First(); k != nil; k, v = c.Next() {
			log.Printf("key=%s, value=%s\n", k, v)
		}
		return nil
	}); err != nil {
		log.Fatal(err)
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值