gORM操作MySQL的实现

ORM 框架

ORM:Object  Relational   Mapping  —— 对象关系映射。

作用:

  • 通过操作结构体对象,来达到操作数据库表的目的。
  • 通过结构体对象,来生成数据库表。

优点:

  • SQL有可能 比较复杂。(Oracle --- 子查询 -- 嵌套)ORM 操作数据库,不需要使用 SQL
  • 不同开发者,书写的 SQL 语句执行效率不同。

go语言支持的 ORM:

gorm 连接数据库、建表

回顾MySQL

  • 确认mysql服务启动: ps xua | grep mysql
  • 连接MySQL数据库: mysql -uroot -p
  • 查看数据库:show databases;
  • 删除数据库:drop database t1;
  • 选择数据库、查看表:use 数据库名  show tables;
  • 创建数据库: create database 库名 charset=utf8;

创建表

连接数据库

import (
 "github.com/jinzhu/gorm"
 _ "github.com/go-sql-driver/mysql"   //"_" 代码不直接使用包, 底层链接要使用!
 "fmt"
)
// mysql: 数据库的驱动名
// 链接数据库 --格式: 用户名:密码@协议(IP:port)/数据库名?xxx&yyy&
conn, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")
if err != nil {
    fmt.Println("gorm.Open err:",err)
    return
}
defer conn.Close()

创建数据库表。 —— 不能使用gorm创建数据库。  提前使用 SQL语句,创建好想要的数据库。

AutoMigrate() 创建表。默认创建的表为复数类型。—— 自动添加“s”
在创建之前, 添加  conn.SingularTable(true) 可以创建非复数表名的表。

// 不要复数表名
conn.SingularTable(true)

// 借助 gorm 创建数据库表.
fmt.Println(conn.AutoMigrate(new(Student)).Error)

查看

mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

MySQL 包的 init 方法

_ "github.com/go-sql-driver/mysql" 导入包时, “_” ,表示,驱使go系统,在main() 函数被调用之前,自动调用 init() 函数。

go语言中有两个特殊函数:  —— 首字母小写,包外可见

  • main()   —— 项目的入口函数
  • init() —— 当导包,但没有在程序中使用。 在main() 调用之前,自动被调用。
    • 查看:光标置于 MySQL包的 “mysql” 上。 使用 Ctrl-鼠标左键。 看到源码。 在 driver.go 底部包含 init() 函数的 定义。
    • init() 作用:实现注册 MySQL 驱动。

gorm的连接池

-- 默认,gorm框架创建好的MySQL数据库连接 conn ,就是一个连接池的句柄。
conn, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")

初始化全局变量, 接收句柄

// 创建全局连接池句柄
var GlobalConn *gorm.DB
GlobalConn = conn

修改连接池初始属性

// 初始数
GlobalConn.DB().SetMaxIdleConns(10)
// 最大数
GlobalConn.DB().SetMaxOpenConns(100)

使用连接池句柄
--- 对比redis连接池:不需要使用 Get() 方法,取一条连接。

// 不要复数表名
GlobalConn.SingularTable(true)
// 借助 gorm 创建数据库表.
fmt.Println(GlobalConn.AutoMigrate(new(Student)).Error)

MySQL 8小时 时区问题

MySQL默认使用的时间 : 美国 东 8 区 时间 。 —— 北京时间 —— 差 8 小时。
在连接数据库时,添加属性:?parseTime=True&loc=Local

conn, err := gorm.Open("mysql”,"root:123456@tcp(127.0.0.1:3306)/test?parseTime=True&loc=Local")

再执行SQL语句、gorm访问MySQL 使用 北京时间。

gorm 操作数据库数据

gorm 插入数据

// insert into student(name, age) values('zhangsan', 100)

func InsertData()  {
 // 先创建数据 --- 创建对象
 var stu Student
 stu.Name = "zhangsan"
 stu.Age = 100

 // 插入(创建)数据
 fmt.Println(GlobalConn.Create(&stu).Error)
}

使用注意事项:

  • 插入数据时,使用的 create() 函数,传参时,必须传入 &对象。 如果遗漏 “&” 会报错
  • 要保证 ,在插入数据库时,GlobalConn.SingularTable(true) 生效。代表不使用 复数表名。

gorm 查询数据

简单查询方法:

First(&user): 获取 user 表中的第一条数据

func SearchData()  {
 var stu Student
 GlobalConn.First(&stu)
 fmt.Println(stu)
}

相当于SQL: SELECT * FROM student ORDER BY id LIMIT 1;
只查询 name、age 不查询其他值:

GlobalConn.Select("name, age").First(&stu)

Last(&user): 获取 user 表中的最后一条数据
相当于SQL: SELECT * FROM users ORDER BY id DESC LIMIT 1

Find(&user): 获取 user 表中的所有数据。

var stu []Student  // 改为切片
GlobalConn.Select("name, age").Find(&stu)   // Find() 查询多条

相当于SQL:select name, age from student;

where 子句使用

select name, age from student where name = 'lisi';
GlobalConn.Select("name, age").Where("name = ?", "lisi").Find(&stu)
select name, age from student where name = 'lisi' and age = 22;
//方法1:
GlobalConn.Select("name, age").Where("name = ?", "lisi").
   Where("age = ?", 22).Find(&stu)
//方法2:
GlobalConn.Select("name, age").Where("name = ? and age = ?", "lisi", 22).Find(&stu)

gorm 更新数据

Save(): 根据主键更新。如果数据没有指定主键,不更新,变为 “插入”操作。

func UpdateData()  {
    var stu Student
    stu.Name = "wangwu"
    stu.Age = 99 // 没有指定 id -- 没有主键! --- 插入
    fmt.Println(GlobalConn.Save(&stu).Error)
}
func UpdateData()  {
    var stu Student
    stu.Name = "wangwu"
    stu.Age = 77
    stu.Id = 4  //指定 id -- 更新操作!
    fmt.Println(GlobalConn.Save(&stu).Error)
}

Update(): 更新一个字段。

fmt.Println(GlobalConn.Model(new(Student)).Where("name = ?", "zhaoliu").
            Update("name", "lisi").Error)
// Model(new(Student): 指定更新 “student” 表

Updates(): 更新多个字段。

fmt.Println(GlobalConn.Model(new(Student)).Where("name = ?", "lisi").
            Updates(map[string]interface{}{"name":"liuqi", "age":24}).Error)

grom 删除数据

删除:物理删除。真正的执行 Delete。

软删除:逻辑删除。不真正删。不执行Delete。

  • 创建表时,在表中添加一个 “删除字段” 。当需要删除时,更新 “删除字段”, 更新为true
  • 查询时,不查询 “删除字段” 为 null 的值。

创建表:

// 创建全局结构体
type Student struct {
      gorm.Model // go语言中, 匿名成员 --- 继承! Student 继承 Model
      Name string
      Age int
}
// 在“Model”上,Ctrl-B 跳转至 Model 类定义。
type Model struct {
      ID        uint `gorm:"primary_key"`
      CreatedAt time.Time
      UpdatedAt time.Time
      DeletedAt *time.Time `sql:"index"`
}
// Model 表由 mysql自动维护,不需要我们手动维护。

执行软删除:

// 使用 Delete() 参数,指定要删除的数据所在表的表名。
fmt.Println(GlobalConn.Where("name = ?", "lisi").Delete(new(Student)).Error)

验证:

select * from student;  依然能看到 “lisi” 相关数据。 但是 。delete_at 字段。被填入数据。

在 gorm 框架中,执行 查询语句:

func SearchData()  {
    var stu []Student
 GlobalConn.Find(&stu)
 fmt.Println(stu)
}

--- 查询结果为: [ ]  ---- "软删除" 成功!

想查询“软删除”的数据:

GlobalConn.Unscoped().Find(&stu)

想 实现 “物理删除”
--- 借助 Unscoped() 执行删除。

GlobalConn.Unscoped().Where("name = ?", "lisi").Delete(new(Student))

gorm 设置表属性

修改表字段大小

// 创建全局结构体
type Student struct {
 Id    int
        // string -- varchar。 默认大小255. 可以在创建表时,指定大小。
 Name  string `gorm:"size:100;default:'xiaoming'"`
 Age   int
 Class int    `gorm:"not null"`
}

结论:修改表属性,只能在第一次建表的时候,有效!或者给表增加新字段的时候,有效!其他场景,修改表属性 ,在 gorm 操作中,无效!

设置时间

默认MySQL数据库 有 3 种时间:

  • date:
  • datetime:
  • timeStamp:时间戳。 ——  gorm 中,只有 timeStamp

如果必须使用 MySQL 数据库特有的 “数据类型”, 使用 “type” 关键字来设置。

// 创建全局结构体
type Student struct {
 Id    int
 Name  string    `gorm:"size:100;default:'xiaoming'"`
 Age   int
 Class int       `gorm:"not null"`
 Join  time.Time `gorm:"type:timestamp"`// 创建 Student 表指定 timestamp类型。
}

到此这篇关于gORM操作MySQL的实现的文章就介绍到这了,更多相关gORM操作MySQL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang gorm 操作mysql及gorm基本用法

    golang 官方的那个操作mysql的有点麻烦所以就使用了gorm,下面就gorm的使用做下简单介绍 下载gorm: go get -u github.com/jinzhu/gorm 在项目中引入gorm: import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) 定义db连接信息 func DbConn(MyUser, Password, Host, Db stri

  • gorm操作MySql数据库的方法

    1.表中字段区分大小写的设置 在使用gorm查询的时候,会出现账户名A和a是一样的情况,是因为mysql默认不区分大小写造成的 1.问题产生的原因 MySQL在Windows下都不区分大小写. MySQL在Linux下数据库名.表名.列名.别名大小写规则是这样的: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小写的: 3.列名与列的别名在所有的情况下均是忽略大小写的: 4.变量名也是严格区分大小写的: MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-

  • gORM操作MySQL的实现

    ORM 框架 ORM:Object  Relational   Mapping  -- 对象关系映射. 作用: 通过操作结构体对象,来达到操作数据库表的目的. 通过结构体对象,来生成数据库表. 优点: SQL有可能 比较复杂.(Oracle --- 子查询 -- 嵌套)ORM 操作数据库,不需要使用 SQL 不同开发者,书写的 SQL 语句执行效率不同. go语言支持的 ORM: gORM:gORM中文文档 xORM: gorm 连接数据库.建表 回顾MySQL 确认mysql服务启动: ps

  • 详解如何利用GORM实现MySQL事务

    目录 前言 禁用默认事务 自动事务 手动事务 嵌套事务 SavePoint.RollbackTo 小结 前言 为了确保数据一致性,在项目中会经常用到事务处理,回滚操作还是比较常见的需求:事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部都执行,要么全不执行,对于MySQL事务相信大家应该都不陌生,这篇文章主要总结一下在Go语言中Gorm是如何实现事务的:感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助. 禁用默认事务 gorm事务默认是开启的.为了确保数据一致性,Gorm会在事务

  • ASP.NET操作MySql数据库的实例代码讲解

    一.把MySql.Data.dll放到BIN目录下. 二.这是aspx.cs的全部源码,修改参数直接运行即可!   using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; publ

  • php简单操作mysql数据库的类

    本文实例讲述了php简单操作mysql数据库的类.分享给大家供大家参考.具体如下: <?php /** * Database class * * @version: 2.2 * @revised: 27 may 2007 * **/ class Database { var $host; var $name; var $user; var $pass; var $prefix; var $linkId; function Database($mysql) { foreach($mysql as

  • Python操作MySQL数据库9个实用实例

    在Windows平台上安装mysql模块用于Python开发 用python连接mysql的时候,需要用的安装版本,源码版本容易有错误提示.下边是打包了32与64版本. MySQL-python-1.2.3.win32-py2.7.exe MySQL-python-1.2.3.win-amd64-py2.7.exe 实例 1.取得 MYSQL 的版本 # -*- coding: UTF-8 -*- #安装 MYSQL DB for python import MySQLdb as mdb con

  • Python Mysql数据库操作 Perl操作Mysql数据库

    首先下载 MySQLdb #encoding=GBK import MySQLdb #import sys # #reload(sys) #sys.setdefaultencoding('utf-8') print 'Connection ...' host='192.168.1.77' user='root' passwd='123456' db='test' conn = MySQLdb.connect(host,user,passwd,db,charset='gbk') print 'Co

  • Linux下实现C++操作Mysql数据库

    想用C++写项目,数据库是必须的,所以这两天学了一下C++操作MySQL数据库的方法.也没有什么教程,就是在网上搜的知识,下面汇总一下. 连接MySQL数据库有两种方法:第一种是使用ADO连接,不过这种只适合Windows平台:第二种是使用MySQL自己的C API函数连接数据库.我是在Linux平台下开发,所以就采用第二种方法,有很多Api函数,但是常用的就几个,我也是就用到其中的几个. API函数 1.mysql_real_connect() 连接一个mysql服务器 MYSQL *mysq

  • 深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非

    PHP程序员应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用中数据库永久连接往往会导致出现一些问题,通常的表现就是在大访问量的网站上时常发生断断续续的无法连接数据库的情况,出现类似"Too many connections in ..."的错误提示信息,重新启动服务器又正常了,但过不了一会儿又出现同样的故障.对于这些问题的成因,恐怕就不是每个人都能说清楚的了,虽然PHP文档里有一些相关资料,但是解释的并不浅显易懂,这

随机推荐