1.准备工作#

我们创建一个目录并且进行初始化

go mod init paginator

## 2.开始

我们需要导入orm,而后导入对应的数据库的包,我们使用的是mysql,于是我们需要导入额外两个包,如下

    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"

为了方便,我们使用flag写一个传递参数来进行初始化的简单程序。我们首先导入flage包

import (
    "flag"
    "fmt"
    "os"

    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

如下

func main() {
    help := flag.Bool("help", false, "print help")
    h := flag.Bool("h", false, "print help")
    gendate := flag.Int("gendata", -1, "产生随机数据")

    flag.Usage = func() {
        fmt.Println("Paginator usage")
        flag.PrintDefaults()
        os.Exit(0)
    }
    flag.Parse()
    if *h || *help {
        flag.Usage()
    }
    switch {
    case *gendate > 0:
        fmt.Println("Start to Generate datas")
        orm.RunSyncdb("default", true, true)
    default:
        fmt.Println("Run Server")
    }
}

如果输入的参数-gendate大于0,就执行orm.RunSyncdb("default", true, true)

3.数据库配置#

另外,我们需要配置数据库的参数,再次之前我已经准备妥当,如下:

func init() {
    orm.RegisterDriver("mysql", orm.DRMySQL)
    orm.Debug = true
    maxIdle := 30
    maxConn := 30
    orm.RegisterDataBase("default", "mysql", "todolist_no1:todolist_no1@tcp(172.25.50.250:3306)/todolista?charset=utf8", maxIdle, maxConn)
}

orm.RegisterDataBase("default", "mysql", "orm_test:passwordyace@tcp(172.25.50.250:3306)/todolist?charset=utf8", maxIdle, maxConn)

我们需要在数据库创建一个库

MariaDB [orm_test]> drop database todolistnoi;
Query OK, 0 rows affected (0.00 sec)

MariaDB [orm_test]>  create database todolista default charset utf8;
Query OK, 1 row affected (0.00 sec)

4.添加字段#

我们创建一个结构体,比如,id,name,age,birthday。如下:

package models

import (
    "time"

    "github.com/astaxie/beego/orm"
)

type User struct {
    Id       int
    Name     string `orm:"unique"`
    Age      uint32
    Birthday time.Time `orm:"type(date)"`
}

func init() {
    orm.RegisterModel(new(User))
}

最终在main中引用

import (
  _ "paginator/models"
)

最后执行go build并且运行

PS E:\golangNode\project\16day\paginator> .\paginator.exe -gendata 200
Start to Generate datas
drop table `user`
    DROP TABLE IF EXISTS `user`

create table `user`
    -- --------------------------------------------------
    --  Table Structure for `paginator/models.User`
    -- --------------------------------------------------
    CREATE TABLE IF NOT EXISTS `user` (
        `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
        `name` varchar(255) NOT NULL DEFAULT ''  UNIQUE,
        `age` integer unsigned NOT NULL DEFAULT 0 ,
        `birthday` date NOT NULL
    ) ENGINE=InnoDB;
PS E:\golangNode\project\16day\paginator>

这样看起来似乎没有问题。

5.插入内容测试#

我们在Model的user.go中添加一个函数用来写入

func geterateRandomTime() time.Time {
    max := time.Now().Unix()
    second := rand.Int63() % int64(max)
    return time.Unix(second, 0)
}
func generateRandoData(count int) []User {
    users := make([]User, count)
    for index, _ := range users {
        users[index].Name = fmt.Sprintf("name_%d", index)
        users[index].Age = rand.Uint32() % 120
        users[index].Birthday = geterateRandomTime()
    }
    return users
}

并且在相对路径下编写一个测试,测试geterateRandomTime函数的时间是否正常。并对generateRandoData进行测试,这里简单测试10条数据

package models

import (
    "fmt"
    "testing"
)

func TestGenerateRandomTime(t *testing.T) {
    for i := 0; i < 10; i++ {
        fmt.Println(geterateRandomTime().Format("2006-01-02 15:04:05"))
    }
}
func TestGenerateRandomNum(t *testing.T) {
    fmt.Println(generateRandoData(10))
}

如下

PS E:\golangNode\project\16day\paginator\models> go test
2003-09-28 18:29:50
1984-10-20 05:30:59
2003-01-30 09:37:53
2014-10-02 15:17:59
2005-10-23 16:19:17
2001-11-01 17:39:36
1995-08-12 01:21:46
1994-03-22 18:06:24
2003-07-24 02:38:12
1998-11-23 07:56:17
[{0 name_0 29 1980-02-06 17:27:35 +0800 CST} {0 name_1 85 1973-04-28 06:40:00 +0800 CST} {0 name_2 56 2000-03-15 14:58:05 +0800 CST} {0 name_3 102 1982-05-02 15:36:23 +0800 CST} {0 name_4 34 2006-09-28 19:42:27 +0800 CST} {0 name_5 70 2009-11-17 11:42:16 +0800 CST} {0 name_6 17 2002-08-04 14:30:13 +0800 CST} {0 name_7 54 1978-03-24 20:32:45 +0800 CST} {0 name_8 15 1998-09-23 08:28:34 +0800 CST} {0 name_9 60 1982-05-30 21:24:47 +0800 CST}]
PASS
ok      paginator/models        0.473s

6.写入数据库#

我们在models的user.go文件中添加一个函数WriterRandomDateTOdb,如下

func WriterRandomDateTOdb(count int) int {
    users := generateRandoData(count)
    o := orm.NewOrm()
    o.InsertMulti(100, users)
    return count
}

而后在main函数中switch部分写入,进行创建tables

    switch {
    case *gendata > 0:
        fmt.Println("Start to Generate datas")
        err := orm.RunSyncdb("default", false, true)
        if err != nil {
            fmt.Println(err)
        }
        models.WriterRandomDateTOdb(*gendata)
    default:
        fmt.Println("Run Server")
    }

运行

PS E:\golangNode\project\16day\paginator> .\paginator.exe -gendata 1
Start to Generate datas
create table `user`
    -- --------------------------------------------------
    --  Table Structure for `paginator/models.User`
    -- --------------------------------------------------
    CREATE TABLE IF NOT EXISTS `user` (
        `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
        `name` varchar(255) NOT NULL DEFAULT ''  UNIQUE,
        `age` integer unsigned NOT NULL DEFAULT 0 ,
        `birthday` date NOT NULL
    ) ENGINE=InnoDB;

[ORM]2019/11/10 16:28:04  -[Queries/default] - [  OK /     db.Exec /    13.0ms] - [INSERT INTO `user` (`name`, `age`, `birthday`) VALUES (?, ?, ?)] - `name_0`, `82`, `2004-03-10 09:05:51 +0800 CST`

回到数据库查看

MariaDB [orm_test]> use todolista
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [todolista]> show tables;
+---------------------+
| Tables_in_todolista |
+---------------------+
| user                |
+---------------------+
1 row in set (0.00 sec)

MariaDB [todolista]> desc user;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11)          | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)     | NO   | UNI |         |                |
| age      | int(10) unsigned | NO   |     | 0       |                |
| birthday | date             | NO   |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [todolista]> select * from user;
+----+--------+-----+------------+
| id | name   | age | birthday   |
+----+--------+-----+------------+
|  1 | name_0 |  82 | 2004-03-10 |
+----+--------+-----+------------+
1 row in set (0.00 sec)