微服务07——GORM

目录

ORM

MySQL

GROM操作MySQL数据库

建立连接和创建表

gorm 插入数据

 grom 查询数据

查询

Select

 WHERE子句

 grom 更新数据

 grom删除数据

更改 struct

软删除 

GORM设置表属性

修改表字段


ORM

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

  • 作用:

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

    • 通过结构体对象,来生成数据库表。

  • 优点:

    • SQL有可能 比较复杂。(Oracle --- 子查询 -- 嵌套)ORM 操作数据库,不需要使用 SQL

    • 不同开发者,书写的 SQL 语句执行效率不同。

  • go语言支持的 ORM:

MySQL

Ubuntu20.04安装Mysql_風の住む街~的博客-CSDN博客_ubuntu20.04安装mysqlUbuntu20.04安装Mysql1.1 下载安装MySQL1.2通过apt 安装MySQL服务2.1 初始化配置2.2检查mysql服务状态3.1配置远程访问3.2新建数据库和用户3.3mysql服务命令4、数据库操作命令4.1mysql服务操作4.2数据库操作4.3表操作4.4修改表结构4.5数据操作4.6数据的备份与恢复4.7卸载1.1 下载安装MySQL在Ubuntu中,默认情况下,只有最新版本的MySQL包含在APT软件包存储库中,要安装它,只需更新服务器上的包索引并安装默认包apt-gethttps://blog.csdn.net/weixin_38924500/article/details/106261971基础命令

  1. 确认mysql服务,启动:ps xua | grep mysql

  2. 检查mysql服务状态 systemctl status mysql.service

  3. 连接MySQL数据库: mysql -u root -p

  4. 查看数据库:show databases;

  5. 删除数据库:drop database t1; t1 代表库名。

  6. 选择数据库、查看表:use 数据库名; show tables;

  7. 删除表 drop table 表名;

  8. 创建数据库: create database test charset=utf8;

  9. 创建一个用来赋予权限的账户(例如 root_sql)

    CREATE USER 'root_sql'@'localhost' IDENTIFIED BY 'yourpasswd';
    GRANT ALL PRIVILEGES ON *.* TO 'root_sql'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;

    注意:命令加分号

GROM操作MySQL数据库

建立连接和创建表

代码

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	_ "github.com/jinzhu/gorm/dialects/sqlite"
)

// 创建全局结构体
type Student struct {
	Id   int //[在grom中Id字段]成为默认的主键,自增长   ---   主键索引,查询速度快
	Name string
	Age  int
}

func main() {

	// 连接数据库   --- 格式: 用户名:密码@协议(IP:port)/数据库名
	conn, err := gorm.Open("mysql", "tian:password@tcp(127.0.0.1:3306)/test")
	if err != nil {
		fmt.Println("grom.Open err:", err)
		return
	}
	defer conn.Close()

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

	// 借助 grom 创建数据库表
	fmt.Println(conn.AutoMigrate(new(Student)).Error) // 执行创建过程打印结果

}

结果

tian@ubuntu:~$ sudo service mysql start
tian@ubuntu:~$ mysql -u tian -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.27-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.01 sec)

mysql> use test;
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
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| students       |
+----------------+
1 row in set (0.01 sec)

mysql> desc students;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| age   | int          | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| student        |
| students       |
+----------------+
2 rows in set (0.02 sec)

mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| age   | int          | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)

mysql> 
 

gorm 插入数据


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

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

}

mysql> select * from student;
Empty set (0.00 sec)

mysql> select * from student;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   18 |
+----+----------+------+
1 row in set (0.00 sec)

 grom 查询数据

查询

// 获取第一条记录,按主键排序
db.First(&user)
 SELECT * FROM users ORDER BY id LIMIT 1;

// 获取最后一条记录,按主键排序
db.Last(&user)
 SELECT * FROM users ORDER BY id DESC LIMIT 1;

// 获取所有记录
db.Find(&users)
 SELECT * FROM users;

// 使用主键获取记录
db.First(&user, 10)
 SELECT * FROM users WHERE id = 10;

Select

db.Select("name, age").Find(&users)
 SELECT name, age FROM users;

db.Select([]string{"name", "age"}).Find(&users)
 SELECT name, age FROM users;

db.Table("users").Select("COALESCE(age,?)", 42).Rows()
 SELECT COALESCE(age,'42') FROM users;

 WHERE子句

// 获取第一个匹配记录
db.Where("name = ?", "jinzhu").First(&user)
 SELECT * FROM users WHERE name = 'jinzhu' limit 1;

// 获取所有匹配记录
db.Where("name = ?", "jinzhu").Find(&users)
 SELECT * FROM users WHERE name = 'jinzhu';

db.Where("name <> ?", "jinzhu").Find(&users)

// IN
db.Where("name in (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)

// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)

// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)

// Time
db.Where("updated_at > ?", lastWeek).Find(&users)

db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)


func SearchData() {

	// 查询第一条
	//var stu Student
	 GlobalConn.First(&stu) //查询第一条的全部信息
	//GlobalConn.Select("name, age").First(&stu) // 只是查询第一条 name age
	//
	//fmt.Println(stu)

	 查询多条
	//var stus []Student
	//GlobalConn.Find(&stus)
	 GlobalConn.Select("name, age").Find(&stus) //Find()查询多条 name age
	//fmt.Println(stus)

	// WHERE 字句
	var stus []Student
	// GlobalConn.Select("name, age").Where("name = ?", "list").Find(&stus)//查询姓名为list 的 name age
	// GlobalConn.Select("name, age").Where("name = ?", "list").Where("age = ?", 28).Find(&stus)
	GlobalConn.Select("name, age").Where("name = ? and age = ?", "list", 28).Find(&stus)
	fmt.Println(stus)

}

 grom 更新数据

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

  • Update(): 更新一个字段。

  • Updates(): 更新多个字段。


func UpdateDate() {

	Model(new(Student): 指定更新 “student” 表
	Where("name = ?", "zhaoliu"): 指定过滤条件。
	Update("name", "lisi").Error):指定 把 “list” 更新成 “zhaoliu”

	//fmt.Println(GlobalConn.Model(new(Student)).
	//	Where("name = ?", "list").
	//	Update("name", "zhaoliu").Error)

	 使用`map`更新多个属性,只会更新这些更改的字段
	//db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
	// UPDATE users SET name='hello', age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

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

}

 grom删除数据

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

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

  • 创建表时,在表中添加一个 “删除字段” 。当需要删除时,更新 “删除字段”, 更新为 :true

  • 查询时,不查询 “删除字段” 为 null 的值。

更改 struct

/*
type Model struct {
	ID        uint `gorm:"primary_key"`
	CreatedAt time.Time
	UpdatedAt time.Time
	DeletedAt *time.Time `sql:"index"`
}
*/


type Student struct {
	gorm.Model // golang中,匿名成员 --- 继承!
	Name       string
	Age        int
}

软删除 

如果模型有DeletedAt字段,它将自动获得软删除功能! 那么在调用Delete时不会从数据库中永久删除,而是只将字段DeletedAt的值设置为当前时间。

func DeleteData() {
	fmt.Println(GlobalConn.Where("name = ?", "zhangsan").Delete(new(Student)).Error) 
}

删除后 deleted_at 值为删除时间,反复删除,时间也是第一次的时间

软查询封装在gorm中,SQL语句中查询可以查到,go代码中查不到。

通过go函数查询

GlobalConn.Find(&stu)

 

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

GlobalConn.Unscoped().Find(&stu)

 

 想实现 物理删除

// --- 借助 Unscoped() 执行删除。
GlobalConn.Unscoped().Where("name = ?", "lisi").Delete(new(Student))

GORM设置表属性

修改表字段

结论:

  •  修改表属性,只能在第一次建表的时候,有效!
  •  或者给表增加新字段的时候,有效!
  •  其他场景,修改表属性 ,在 gorm 操作中,无效!
// 创建全局结构体
type Student struct {
	Id    int    //[在grom中Id字段]成为默认的主键,自增长   ---   主键索引,查询速度快
	Name  string `gorm:"size:100;default:'xiaoming'"` // string -- varcha  默认大小255.可以在创建表时,指定表的大小。默认值 xiaoming
	Age   int
	Class int `gorm:"not null"`
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gorm scopes是Golang中使用的一种功能,用定义和应用查询作用域。它可以帮助我们在查询数据库时,根据不同的条件和需求,动态地构建查询语句。 使用gorm scopes,我们可以将一组查询条件封装成一个作用域(scope),然后在需要的时候应用到查询中。这样可以使代码更加模块化和可复用,同时也能提高查询的灵活性和可读性。 在gorm中,我们可以通过定义结构体的方法来创建作用域。这些方法需要接收一个gorm.DB类型的参数,并返回一个gorm.DB类型的结果。在方法内部,我们可以使用gorm提供的各种查询方法来构建查询条件,例如Where、Order、Limit等。 下面是一个使用gorm scopes的示例: ```go type User struct { ID uint Name string Age int } func (db *gorm.DB) AgeGreaterThan(age int) *gorm.DB { return db.Where("age > ?", age) } func main() { db, err := gorm.Open("mysql", "user:password@tcp(localhost:3306)/database") if err != nil { panic(err) } defer db.Close() var users []User db.Scopes(db.AgeGreaterThan(18)).Find(&users) } ``` 在上面的示例中,我们定义了一个名为AgeGreaterThan的作用域,它接收一个年龄参数,并返回一个添加了查询条件的gorm.DB对象。然后,在main函数中,我们通过调用Scopes方法并传入AgeGreaterThan作用域,来应用该作用域到查询中。 这样,最终执行的查询语句将会是`SELECT * FROM users WHERE age > 18`,并将结果存储到users变量中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值