项目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)
}
}