使用Go搭建简单的RESTful服务器之后端数据库实现

模仿swapi搭建一个前后端协调可用的数据查询服务器

1544949349993

建立数据库

调用github.com/boltdb/boltOpen函数创建一个容器

类似于这样的语句root.CreateBucketIfNotExists([]byte("Planets"))创建一个而带有标号的桶,以后关于Planet的数据都放进这个桶里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func setupDB() (*bolt.DB, error) {
db, err := bolt.Open("swapi.db", 0600, nil)
if err != nil {
return nil, fmt.Errorf("could not open db, %v", err)
}
err = db.Update(func(tx *bolt.Tx) error {
root, err := tx.CreateBucketIfNotExists([]byte("DB"))
if err != nil {
return fmt.Errorf("could not create root bucket: %v", err)
}
_, err = root.CreateBucketIfNotExists([]byte("Planets"))
_, err = root.CreateBucketIfNotExists([]byte("Species"))
_, err = root.CreateBucketIfNotExists([]byte("Vehicle"))
_, err = root.CreateBucketIfNotExists([]byte("Starship"))
_, err = root.CreateBucketIfNotExists([]byte("Person"))
_, err = root.CreateBucketIfNotExists([]byte("Film"))
return nil
})
if err != nil {
return nil, fmt.Errorf("could not set up buckets, %v", err)
}
fmt.Println("DB Setup Done")
return db, nil
}

插入数据函数

调用数据库的Update函数,传递一个参数,而且这个参数也是一个函数

通过bucketName找到对应的bucket,然后插入一条idjsonStr对应的数据

这里有点冗余地调用*bolt.DB参数,其实小程序全局用一个桶就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func addToBucket(db *bolt.DB, jsonStr string, id string, bucketName string) error {

planetBytes := []byte(jsonStr)

err := db.Update(func(tx *bolt.Tx) error {
err := tx.Bucket([]byte("DB")).Bucket([]byte(bucketName)).Put([]byte(id), []byte(planetBytes))
if err != nil {
return fmt.Errorf("could not insert %s: %v", bucketName, err)
}

return nil
})
fmt.Println("Added " + bucketName)
return err
}

添加数据

这里使用了os/exec

通过循环查询swapi.co网站的数据写入到我们自己的数据库中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const (
planet = 1
species = 2
vehicle = 3
starship = 4
people = 5
film = 6
)
var tabText = map[int]string{
planet: "Planets",
species: "Species",
vehicle: "Vehicle",
starship: "Starship",
people: "People",
film: "Film",
}
var nameText = map[int]string{
planet: "planets",
species: "species",
vehicle: "vehicles",
starship: "starships",
people: "people",
film: "films",
}
var curl []byte
var cmd *exec.Cmd
for i := 1; i < 100; i++ {
for k := 1; k <= 6; k++ {
// fmt.Println("https://swapi.co/api/" + nameText[k] + "/" + string(i) + "/")
// fmt.Println(string(i))
ID := strconv.Itoa(i)
cmd = exec.Command("curl", ("https://swapi.co/api/" + nameText[k] + "/" + ID + "/"))
if curl, err = cmd.Output(); err != nil {
fmt.Println(err)
os.Exit(1)
}

// fmt.Println(("https://swapi.co/api/" + nameText[k] + "/" + ID + "/"))
JSONStr := strings.TrimRight(string(curl), "\n")
fmt.Println(JSONStr)
fmt.Println(ID)

err = addToBucket(db, JSONStr, ID, tabText[k])
if err != nil {
log.Fatal(err)
}
}
}

后端测试

1544953263611

感谢资助辣条吃!
  • 本文作者: Janking
  • 本文链接: https://janking.wang/post/swapi.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!