Go 中的 MySql 和 ORM

Mysql 基础

在你的终端输入如下代码:

/usr/local/mysql/bin/mysql -u root -p

执行命令之后,输入你的 Mysql 数据库密码,成功之后显示:

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

创建 test 数据库:

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

显示所有存在的数据库:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| DB                 |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)

可以看到 test 数据库已经成功创建。接下来我们在 test 数据库创建两张表:userinfo 和 userdetail。首先切换到 test 数据库。我们先看看当前正在使用的数据库:

mysql> select database()
    -> ;
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

切换操作:

mysql> use test;
Database changed

如上,我们就成功切换到 test 数据库中了,接下来我们创建两张表啦:

mysql> CREATE TABLE `userinfo` (
    ->         `uid` INT(10) NOT NULL AUTO_INCREMENT,
    ->         `username` VARCHAR(64) NULL DEFAULT NULL,
    ->         `departname` VARCHAR(64) NULL DEFAULT NULL,
    ->         `created` DATE NULL DEFAULT NULL,
    ->         PRIMARY KEY (`uid`)
    ->     );
mysql> CREATE TABLE `userdetail` (
    ->         `uid` INT(10) NOT NULL DEFAULT '0',
    ->         `intro` TEXT NULL,
    ->         `profile` TEXT NULL,
    ->         PRIMARY KEY (`uid`)
    ->     );
Query OK, 0 rows affected (0.02 sec)

查看表是否显示成功:

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| userdetail     |
| userinfo       |
+----------------+
2 rows in set (0.00 sec)

我们想看看所建表的结构的话:

mysql> desc userinfo;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| uid        | int(10)     | NO   | PRI | NULL    | auto_increment |
| username   | varchar(64) | YES  |     | NULL    |                |
| departname | varchar(64) | YES  |     | NULL    |                |
| created    | date        | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

向表中插入数据,并显示出来:

mysql> insert into userdetail VALUES ('2','Hello world', "I am allenuw");
Query OK, 1 row affected (0.00 sec)

mysql> select * from userdetail;
+-----+-------------+--------------+
| uid | intro       | profile      |
+-----+-------------+--------------+
|   2 | Hello world | I am allenuw |
+-----+-------------+--------------+
1 row in set (0.00 sec)

上面就是 Mysql 数据表最基本的操作了,还有很多要学习,其他的话大家 Google 一下就好了。接下来我们讲述 Go 中如何操作 Mysql 数据库。

Golang 操作 Mysql Go没有内置的驱动支持任何的数据库,但是Go定义了database/sql接口,用户可以基于驱动接口开发相应数据库的驱动。这一节来尝试与喜爱 mysql 的驱动

go get github.com/go-sql-driver/mysql

安装好 mysql 驱动之后,我们按照上述的步骤在终端创建两张表分别是:userinfo 和 userdetail。接下来看看 Go 官方提供的示例代码:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    //"time"
)

func main() {
    db, err := sql.Open("mysql", "root:123456@/test?charset=utf8")
    checkErr(err)
    //插入数据
    stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
    checkErr(err)
    res, err := stmt.Exec("astaxie", "WeChat", "2012-12-09")
    checkErr(err)
    id, err := res.LastInsertId()
    checkErr(err)
    fmt.Println(id)
    //更新数据
    stmt, err = db.Prepare("update userinfo set username=? where uid=?")
    checkErr(err)
    res, err = stmt.Exec("astaxieupdate", id)
    checkErr(err)
    affect, err := res.RowsAffected()
    checkErr(err)
    fmt.Println(affect)
    //查询数据
    rows, err := db.Query("SELECT * FROM userinfo")
    checkErr(err)

    for rows.Next() {
        var uid int
        var username string
        var department string
        var created string
        err = rows.Scan(&uid, &username, &department, &created)
        checkErr(err)
        fmt.Println(uid)
        fmt.Println(username)
        fmt.Println(department)
        fmt.Println(created)
    }
    //删除数据
    stmt, err = db.Prepare("delete from userinfo where uid=?")
    checkErr(err)
    res, err = stmt.Exec(id)
    checkErr(err)
    affect, err = res.RowsAffected()
    checkErr(err)
    fmt.Println(affect)
    db.Close()
}
// 存在 error 进行 painc
func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

输出结果如下所示:

[ `go run mysql_demo.go` | done: 345.222169ms ]
  1
  1
  1
  astaxieupdate
  WeChat
  2012-12-09
  1

Beego 进行 ORM

ORM 是一种对象关系的映射。接下来体验一下 Beego 中内部支持的 ORM。我们还是先来安装 beego 框架。

go get github.com/astaxie/beego

package main

import (
    "fmt"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql" // 导入数据库驱动
)

// Model Struct
type User struct {
    Id   int
    Name string `orm:"size(100)"`
}

func init() {
    // 设置默认数据库
    orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30)

    // 注册定义的 model
    orm.RegisterModel(new(User))
    //RegisterModel 也可以同时注册多个 model
    //orm.RegisterModel(new(User), new(Profile), new(Post))

    // 创建 table
    orm.RunSyncdb("default", false, true)
}

其中第二个 root是你的本地 Mysql 数据库密码,而 my_db 就是你的数据库名称。下面是一些常用的操作:

func main() {
    o := orm.NewOrm()
    // 基本的赋值
    user := User{Name: "slene"}

    // 插入表
    id, err := o.Insert(&user)
    fmt.Printf("ID: %d, ERR: %v\n", id, err)

    // 更新表
    user.Name = "astaxie"
    num, err := o.Update(&user)
    fmt.Printf("NUM: %d, ERR: %v\n", num, err)

    // 读取 one
    u := User{Id: user.Id}
    err = o.Read(&u)
    fmt.Printf("ERR: %v\n", err)

    // 删除表
    num, err = o.Delete(&u)
    fmt.Printf("NUM: %d, ERR: %v\n", num, err)
}

如上可见,我们基本上没有直接对 Mysql 数据库进行操作,而是通过一个实体类型来对数据库某个表进行各种操作。

联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2024

备案号:京ICP备15003423号-3