- 1.编写命令行传递参数
- 2.编写数据结构体
- 3.编写数据库权限,和数据库文件
- 4.测试数据库写入
- 5.路由
- 6.视图
- 7.启动
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)
"mysql"
: 表示使用的是mysqlorm_test:passwordyace
: 用户名和密码tcp(172.25.50.250:3306)
: ip地址和端口todolista
: 用户拥有此表
我们需要在数据库创建一个库
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)