【字节跳动青训营】后端笔记整理-4 | Go框架三件套之GORM的使用
**本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金。
我的go开发环境:
*本地IDE:GoLand 2023.1.2
*go:1.20.6
*MySQL:8.0
本文介绍Go框架三件套的使用。
Go 框架三件套通常指的是 GORM、Kitex 和 Hertz,它们分别是 Go 语言中数据库 ORM 库、分布式微服务框架和 Web 框架。
下面我们来逐个介绍各框架的使用。
GORM:数据库 ORM 库
🔗GORM 官方文档:https://gorm.cn/zh_CN/docs/connecting_to_the_database.html
1、GORM的简介
GORM 是 Go 语言中一个强大的 ORM 库(ORM 即对象关系映射,是一种程序设计技术,用于将不同类型的数据进行转换从而实现面向对象编程语言与数据库之间的交互),用于简化数据库操作。
它目前支持 MySQL、SQLServer、PostgreSQL、SQLite,提供了一系列便捷的 API 用于进行数据库的增删改查等操作,还支持模型定义、关联查询等高级功能。
GORM 是通过驱动的方式来连接数据库的, GORM 的基本使用步骤如下:
- 安装 GORM:使用
go get
命令获取 GORM 包及数据库驱动。 - 连接数据库:导入 GORM 包并创建数据库连接,例如连接 SQLite。
- 定义模型:创建结构体来定义数据库表与字段的映射关系。
- 自动迁移:使用
AutoMigrate
方法自动创建或更新数据库表结构。 - 数据操作:使用
Create
、First
、Where
等方法进行增删改查操作。
本文以 MySQL 数据库为例进行演示。
2、GORM的基本使用(以MySQL为例)
我们先来看一下总体的GORM的使用:
*GORM的约定(默认情况)
- GORM使用名为ID的字段作为主键。
- (未给model定义表名时)使用结构体的蛇形复数作为表名。
- 字段名的蛇形作为列名。
- 使用 CreatedAt、UpdatedAt 字段作为创建更新时间。
蛇形命名:
在数据库中,蛇形命名(Snake Case)是一种命名约定,用于在标识符中使用下划线(_)分隔单词。蛇形命名的主要特点是所有单词都小写,并且使用下划线分隔,例如:
user_info
、order_details
。与蛇形命名相对的是驼峰命名(Camel Case)。复数形式: 在 GORM 中默认情况下,如果结构体名称是单数形式(例如
User
),那么 GORM 会将其转换为表名的复数形式(例如users
)。这个行为是 GORM 的默认命名约定之一,目的是在数据库中使用表的复数形式来存储多条记录。这种默认的复数形式表名的转换规则是为了遵循一些数据库的命名习惯,同时也有助于避免表名与保留关键字冲突。
步骤 1:安装 GORM 和 MySQL 驱动
首先,打开Goland终端,使用 go get
命令安装 GORM 包和 MySQL 驱动:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
步骤 2:连接数据库
安装好驱动后,可以在 Go 代码中导入 GORM 包和 MySQL 驱动并创建数据库连接:
package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""log"
)func main() {dsn := "user:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {log.Fatal("无法连接数据库")}// 在这里可以使用 db 进行数据库操作
}
DSN中包含了数据库连接相关的信息。🔗MySQL的DSN说明文档
将上面的代码中DSN的 user
、password
、host
、port
、database
分别替换为实际要连接的 MySQL 数据库的信息即可连接成功。
步骤 3:定义模型和操作数据库
在连接数据库之后,定义数据模型 model 并使用 GORM 进行数据库操作。
以下是一个简单的示例,演示了如何定义一个 User
模型,并进行插入、查询、更新和删除操作:
package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""log"
)type User struct {ID uint `gorm:"primaryKey"`Name stringAge int
}func main() {dsn := "user:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {log.Fatal("无法连接数据库")}db.AutoMigrate(&User{})// 插入数据newUser := User{Name: "Alice", Age: 25}db.Create(&newUser)// 查询数据var user Userdb.First(&user, 1)// 更新数据db.Model(&user).Update("Age", 26)// 删除数据db.Delete(&user)
}
db.AutoMigrate(&User{})
是 GORM 提供的一个方法,用于自动创建或更新数据库表结构,以使其与你定义的模型保持一致。它在应用程序启动时非常有用,可以确保数据库表的结构与代码中定义的模型一致,而无需手动创建表或执行 SQL 脚本。具体来说,
AutoMigrate
方法会根据你定义的模型结构(通过结构体字段的标签)生成相应的数据库表,并且可以自动处理新增的字段、修改的字段类型、删除的字段等变化。这在开发过程中特别有用,因为你可以在模型结构中进行更改,然后通过自动迁移保持数据库表结构的更新。在上述示例中,当应用程序启动时,
db.AutoMigrate(&User{})
会检查数据库中是否存在名为users
的表,如果不存在则创建这张表,字段与User
结构体中的定义保持一致。如果已存在表,GORM 会根据模型定义的变化自动更新表结构,例如新增、修改、删除字段。
更改DSN的信息后,在本地运行上述代码,观察结果:
// 插入数据
newUser := User{Name: "Alice", Age: 25}
db.Create(&newUser)
// 查询数据
var user User
db.First(&user, 1)fmt.Printf("%+v\n", user)//%+v 格式化占位符会打印出结构体的字段名和对应的值,以便更清晰地查看结构体的内容。
控制台打印查询结果:
注意:在实际使用中,请务必妥善保管数据库的敏感信息,如用户名、密码等,避免泄露。
//要先通过查询的操作将数据库中某一字段写入model,以建立起关联
//该代码查询出数据库中主id为6的记录
var user User
db.First(&user, 6)
// 更新数据
db.Model(&user).Update("Age", 26)
在 GORM 中,如果想要更新数据库中的数据,首先需要通过查询语句获取到要更新的数据,并将获取到的结果赋值给相应的结构体变量,然后再使用 Update
或 Updates
方法来进行实际的更新操作。
// 删除数据
db.Delete(&user)
将指定数据删除:
总之,使用 GORM 连接 MySQL 数据库非常简单,只需要按照上述步骤导入相关包并配置数据库连接信息,就能够使用 GORM 提供的便捷 API 进行数据库操作。
3、GORM主要API详解
GORM中,各个API是链式调用的。Where()的工作只是拼接sql,而Create(),First(),Update(),Delet()等才是真正执行sql的。如果顺序颠倒,调用完后者,再去调用Where(),那么Where条件是不会生效的。
(1)GORM创建数据 Create()
Create()方法可以创建一条数据,也可以批量创建数据。
创建一条数据记录
newUser := User{Name: "Alice", Age: 25} //创建结构体
result := db.Create(&newUser)if result.Error != nil {log.Fatal("无法创建数据:", result.Error)
}
批量创建多条数据记录
在 GORM 中,要使用 Create
方法批量创建数据,需要将多个数据记录组成切片,然后使用 Create
方法进行批量插入。
users := []User{{Name: "Alice", Age: 25},{Name: "Bob", Age: 30},{Name: "Charlie", Age: 28},
}
result := db.Create(&users)if result.Error != nil {log.Println("无法创建数据:", result.Error)
}
青训营培训中,李龙讲师给出的代码解析如下:
使用 clause.OnConflict 处理数据冲突
如何使用默认值?
通过使用 default 标签为字段定义默认值。
(2)GORM查询数据 First() Find()
查询一条数据
First()
方法用于查询数据库中的第一条符合条件的记录,并将结果存储在指定的结构体变量中。默认按照主键顺序进行查询,通常为创建记录时的顺序。如果需要按照其他字段排序,可以使用 Order
方法进行排序。
这个方法适用于需要查询一条记录的情况。
以下是 First()
方法的基本用法:
db.First(&user, 1)
db
:是一个 GORM 数据库连接实例。First
:是 GORM 提供的查询方法。&user
:表示要将查询结果存储到名为user
的结构体变量中。注意,这里使用了&
操作符,表示传递了user
变量的内存地址,以便在查询结果中存储数据。1
:是查询的条件,这里表示按照主键为 1 进行查询。
First()
方法执行后,会从数据库中获取满足条件的第一条数据记录,并将结果存储在 user
变量中。如果没有找到符合条件的记录,user
变量将保持不变(即空的结构体值),会返回 ErrRecordNotFound
如果需要根据其他条件进行查询,可以使用 GORM 的查询条件构造方法(例如 Where
、Or
等)来构建查询条件:
基本的条件查询:
// 查询 name 为 "Alice" 的第一条记录
db.Where("name = ?", "Alice").First(&user)
AND 和 OR 条件查询:
// 查询 age 大于等于 25 并且 name 不为 "Bob" 的记录
db.Where("age >= ? AND name <> ?", 25, "Bob").Find(&users)// 查询 age 小于 30 或者 name 为 "Alice" 的记录
db.Where("age < ? OR name = ?", 30, "Alice").Find(&users)
IN 条件查询:
// 查询 age 在给定的列表 [25, 30] 中的记录
ages := []int{25, 30}
db.Where("age IN ?", ages).Find(&users)
LIKE 条件查询:
// 查询 name 包含 "li" 的记录
db.Where("name LIKE ?", "%li%").Find(&users)
其他查询条件:
GORM 还提供了许多其他的查询条件构造方法,如 Not
、Or
、Between
、IsNull
、NotNull
等,可以根据需要选择合适的条件方法来构建复杂的查询。
查询一组数据
在 GORM 中,Find()
方法用于执行查询并从数据库中检索满足指定条件的多条记录。它会将查询结果存储到指定的切片或数组中。Find()
方法适用于需要查询多条记录的情况,例如根据某个条件查找多个数据记录。
以下是 Find()
方法的基本用法:
db.Find(&users)
Find
:是 GORM 提供的查询方法。&users
:表示要将查询结果存储到名为users
的切片或数组中。注意,这里使用了&
操作符,表示传递了users
变量的内存地址,以便在查询结果中存储数据。
Find()
方法执行后,会从数据库中获取满足条件的多条数据记录,并将结果存储到 users
变量中。如果没有找到符合条件的记录,users
变量将保持为空切片(或空数组)。
需要注意的是,当使用 Find()
方法时,需要确保目标切片或数组的元素类型与数据库中的记录结构体类型相匹配。
培训中代码解析:
为什么要创建一个指向结构体的指针的切片
在 GORM 中,查询多组数据通常会使用切片来存储查询结果。而为什么要创建一个指向结构体的指针的切片,涉及到 Go 语言中切片和结构体的内存管理以及 GORM 的工作机制。
切片的引用语义: 在 Go 语言中,切片是引用类型。这意味着当你将切片传递给函数或方法时,实际上传递的是切片的引用,而不是它的拷贝。当切片被修改时,所有引用这个切片的地方都会受到影响。因此,使用切片可以在多个地方共享数据,而无需进行显式的复制。
指向结构体的指针: 在 GORM 中,查询结果需要映射到特定的结构体上。由于 GORM 需要修改结构体字段的值以反映数据库的实际数据,所以在查询结果存储时,必须传递结构体的指针。这样 GORM 才能直接修改结构体的字段。
因此,当使用 GORM 查询多组数据时,需要创建一个指向结构体的指针的切片,以便将查询结果存储在切片中。这样,切片中的每个元素都指向一个具体的结构体实例,而 GORM 可以直接修改这些实例的字段来填充查询结果。
在示例代码中,users := make([]*User, 0)
创建了一个初始为空的指向 User
结构体的指针的切片。然后,通过 db.Where(query:"age > 0").Find(&users)
将查询结果存储到这个切片中。这样就可以在切片中得到查询的多组数据,并且每个元素都是一个指向 User
结构体的指针,GORM 可以使用这些指针来填充查询结果。
First 的使用踩坑
- 使用 First 时,需要注意查询不到数据会返回 ErrRecordNotFound。
- 使用 Find 查询多条数据,查询不到数据不会返回错误。(更多的是使用Find,然后自己通过判断处理是否查询到数据。)
- 使用结构体作为查询条件。
- 当使用结构作为条件查询时,GORM只会查询非零值字段。这意味着如果您的字段值为 0、"、false 或其他零值该字段不会被用于构建查询条件,使用Map 来构建查询条件。
(3)GORM更新数据 Update() Updates()
注意:
- 使用 Struct 进行更新时,只会更新非零值,如果需要更新零值可以使用 Map 更新或使用Select 选择字段。
map[string]interface{}
是 Go 语言中的一种数据结构,用于存储键值对,其中键是字符串类型,值是空接口类型。这种数据结构允许你在一个 map 中存储不同类型的值。
解释一下其中的各个部分:
map
:是 Go 语言中的一种内置数据结构,用于存储键值对。每个键在 map 中必须是唯一的。string
:表示 map 的键的数据类型,这里是字符串类型。interface{}
:表示 map 的值的数据类型,这里是空接口类型。空接口可以存储任何类型的值,因为所有类型都满足空接口类型。
使用 map[string]interface{}
时,可以将任何类型的值与字符串键关联起来。这在一些动态的情况下非常有用,比如需要在一个 map 中存储不同类型的配置项或数据。
以下示例演示了如何使用 map[string]interface{}
存储不同类型的值:
package mainimport "fmt"func main() {// 创建一个 map,键是字符串,值是空接口类型data := make(map[string]interface{})// 存储不同类型的值data["name"] = "Alice"data["age"] = 25data["isStudent"] = true// 输出 map 中的值fmt.Println(data["name"])fmt.Println(data["age"])fmt.Println(data["isStudent"])
}
(4)GORM删除数据 Delete()
物理删除
软删除
以往我们实现软删的思路通常是设定一个flag,flag为1时没有删除,flag为0是删除。但GORM中已经给我们提供了一个比较完备的软删方案。
GORM 提供了 gorm.DeletedAt 用于帮助用户实现软删,拥有软删除能力的 Model 调用 Delete 时,记录不会被从数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间并且你不能再通过正常的查询方法找到该记录。
而使用 Unscoped 可以查询到被软删的数据。
4、GORM事务
Gorm 提供了 Begin、Commit、Rollback 方法用于使用事务。
在 GORM 中,使用 tx := db.Begin()
开启事务后,建议后续的数据库操作都使用 tx
来调用,而不是使用 db
。这是因为事务对象 tx
是从数据库连接对象 db
衍生出来的,它继承了数据库连接的属性,并且使用事务对象 tx
可以确保数据库操作的一致性、原子性和性能,同时简化错误处理。在事务中进行操作可以保证这些操作在同一个数据库事务内执行,从而避免了许多潜在的并发问题。
- 事务的原子性: 在事务中进行的所有数据库操作要么全部成功提交,要么全部回滚。这确保了操作的原子性,避免了因为其中一个操作失败而导致数据库数据的不一致性。
- 性能优化: 在事务中进行操作会优化数据库连接的使用。事务通常会使用数据库连接池中的一个连接,而不是每个操作都创建新的连接。这可以降低资源消耗,提高性能。
- 数据一致性: 使用
tx
调用后续的数据库操作可以确保这些操作在同一个事务内执行。这意味着在事务中的操作都是基于同一个数据库快照,避免了因为并发操作而导致数据不一致的问题。 - 错误处理: 使用
tx
可以更方便地处理错误。如果在事务中的任何操作出现错误,可以直接调用tx.Rollback()
来回滚整个事务。而使用db
进行操作时则需要在出现错误时手动处理回滚。
5、GORM Hook
GORM 在 提供了 CURD 的 Hook 能力。Hook 是在创建、查询、更新、删除等操作之前、之后自动调用的函数。
如果任何 Hook 返回错误,GORM 将停止后续的操作并回滚事务。
6、GORM性能提高
- 对于写操作(创建、更新、删除),为了确保数据的完整性,GORM 会将它们封装在事务内运行但这会降低性能,可以使用 SkipDefaultTransaction 关闭默认事务。
- 使用 PrepareStmt 缓存预编译语句可以提高后续调用的速度,本机测试提高大约 35 %左右。
其他的性能优化方案见官方文档:🔗GORM性能提高
7、GORM生态
GORM 拥有非常丰富的扩展生态,以下列举一部分常用扩展:
GORM 代码生成工具:https://github.com/go-gorm/gen
GORM 分片库方案:https://github.com/go-gorm/sharding
GORM 手动索引:https://github.com/go-gorm/hints
GORM 乐观锁:https://github.com/go-gorm/optimisticlock
GORM 读写分离:https://github.com/go-gorm/dbresolver
GORM OpenTelemetry 扩展:https://github.com/go-gorm/opentelemetry
关于更多的 GORM 用法可以查看 Gorm 的文档(https://gorm.cn)。
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/007d079c1aa81cca96c93eb3d04072ca.png#?w=2694&h=574&e=png&b=fefcfc)
【字节跳动青训营】后端笔记整理-4 | Go框架三件套之GORM的使用
**本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金。 我的go开发环境: *本地IDE:GoLand 2023.1.2 *go:1.20.6 *MySQL:8.0 本文介绍Go框架三…...
![](https://img-blog.csdnimg.cn/5f79c48cb25f4dd19d7db40d0959cbd8.png)
【TI毫米波雷达笔记】UART串口外设配置及驱动(以IWR6843AOP为例)
【TI毫米波雷达笔记】UART串口外设初始化配置及驱动(以IWR6843AOP为例) 最基本的工程建立好以后 需要给SOC进行初始化配置 int main (void) {//刷一下内存memset ((void *)L3_RAM_Buf, 0, sizeof(L3_RAM_Buf));int32_t errCode; //存放SOC初…...
![](https://img-blog.csdnimg.cn/2b166c410eda4976a1397f647fb30fc5.png)
C#---第十九课:不同类型方法的执行顺序(new / virtual / common / override)
本文介绍不同类型的方法,在代码中的执行顺序问题: 构造方法普通方法(暂用common代替)、虚方法(Virtual修饰)、New方法(new修饰)三个优先级相同overide方法(会替换virtual…...
![](https://www.ngui.cc/images/no-images.jpg)
[pytorch]torch.cuda用法以及判断显卡是不是存在问题
常见用法: torch.cuda.is_available() # 查看是否有可用GPU torch.cuda.device_count() # 查看GPU数量 torch.cuda.get_device_capability(device) # 查看指定GPU容量 torch.cuda.get_device_name(device) # 查看指定GPU名称 torch.cuda.empty_cache() # 清空程序占…...
![](https://img-blog.csdnimg.cn/40f8676d759a4ef7bfbdded1e060d09b.png)
JUC——多线程补充
前置可看 Java——多线程和锁_java多线程锁_北岭山脚鼠鼠的博客-CSDN博客 线程创建的三种方式 Thread、Runnable、Callable Thread类 Runable接口 Callable接口 Lamda表达式 Lamda表达式_北岭山脚鼠鼠的博客-CSDN博客 静态代理模式(Thread类的原理) 如下代码中 真实对象…...
![](https://img-blog.csdnimg.cn/e3bfb35897f943b5b586a424501ef030.png)
代码随想录第32天|122.买卖股票的最佳时机 II,55. 跳跃游戏 ,45. 跳跃游戏 II
122.买卖股票的最佳时机 II 122. 买卖股票的最佳时机 II 思路比较简单 class Solution {public int maxProfit(int[] prices) {int res0,sum0;for(int i0;i<prices.length-1;i){if(prices[i1]-prices[i]>0){sumprices[i1]-prices[i];}ressum>res?sum:res;}return …...
![](https://img-blog.csdnimg.cn/f6a0664be636436ca1f3edea5b10f686.png)
Linux:Nginx服务与搭建
目录 一、Nginx概述 二、Nginx三大作用:反向代理、负载均衡、动静分离 三、Nginx和Apache 3.1Nginx和Apache的差异 3.2Nginx和Apache的优缺点比较 四、编译安装niginx 五、创建Nginx 自启动文件 六、Nginx的信号使用 6.1信号 七、升级 nginx1.18 nginx1.2…...
![](https://www.ngui.cc/images/no-images.jpg)
4、什么是NoSQL
4、什么是NoSQL NoSQL NoSQL Not Only SQL,就是不仅仅是SQL的意思 泛指非关系型数据库,随着web2.0的诞生!传统的关系型数据库很难对付web2.0时代,因为web2.0时代又很多数据大爆炸新生的产物比如视频、音乐、大数据产生的其他的数…...
![](https://img-blog.csdnimg.cn/090b439ac1b44dc78e11cc6d5fc7c82f.png)
如何自己实现一个丝滑的流程图绘制工具(一)vue如何使用
背景 项目需求突然叫我实现一个类似processOn一样的在线流程图绘制工具。 这可难倒我了,立马去做调研,在github上找了很多个开源的流程图绘制工具, 对比下来我还是选择了 bpmn-js 原因: 1、他的流程图是涉及到业务的,…...
![](https://img-blog.csdnimg.cn/4469a14db39e4d34b2c48a6f1df2af53.png)
ReoGrid.NET集成到winfrom
ReoGrid一个支持excel操作的控件,支持集成到任何winfrom项目内。 先看效果图: 如何使用: 使用ReoGrid自带excel模版设计工具先设计一个模版,设计器如下: 具体例子看官方文档 代码示例如下: var sheet reoGridControl1.CurrentWorksheet; …...
![](https://www.ngui.cc/images/no-images.jpg)
Elasticsearch实现增删改查
调用elasticsearch通常使用restful风格请求,这里记录一些常用的Java API和Postman Url Java API调用Es 1. 查询总文档数 Testvoid getAllCount() { // RestHighLevelClient clientnew RestHighLevelClient(RestClient.builder(new HttpHost("192.168…...
![](https://www.ngui.cc/images/no-images.jpg)
Rust 学习笔记(卷二)
文章目录 Rust 学习笔记(卷二)八、工程1. package 和 cratepackage 总览包根(crate root) 2. 模块初识模块单个源文件中的嵌套模块使用具有层级结构的源文件构造嵌套模块 3. 文档4. 使用第三方包5. 打包自己的包 九、标准库十、多…...
![](https://www.ngui.cc/images/no-images.jpg)
android amazon 支付接入
流程: 申请 Amazon 开发者帐号 ---> 在 amazon 控制台添加应用 ---> 添加应用内商品(消费类商品,授权类商品,订阅类商品)---> 导出 JSON 文件 --->集成 Amazon 支付 ---> 将导出的 JSON 文件 copy 到 …...
![](https://img-blog.csdnimg.cn/a3ebfeeea6e34d20ba4eda788b73c294.png)
Vue2-快速搭建pc端后台管理系统
一.推荐二次开发框架 vue-element-admin Star(84k)vue-antd-admin Star(3.5k) 二.vue-element-admin 官网链接:https://panjiachen.github.io/vue-element-admin-site/zh/ 我这里搭建的是基础模版vue-admin-template(推荐) # 克隆项目 git clone https://github.com/PanJi…...
![](https://img-blog.csdnimg.cn/img_convert/7ca92a8ebabd27e7ee9896e725259d7e.jpeg)
【产品文档】团队介绍PPT模板
今天和大家免费分享团队介绍的PPT模板。团队介绍是向他人展示团队的实力、专业性和能力的重要方式。通过一个有力的团队介绍,您可以突出团队的成员、经验、技能和取得的成就,从而增加信任、吸引合作伙伴、客户或投资者的兴趣 【模板预览】 动态演示效果…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.5/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N6B9)
组件库的使用和自定义组件
目录 一、组件库介绍 1、什么是组件 2、组件库介绍 3、arco.design 二、组件库的使用 1、快速上手 2、主题定制 3、暗黑模式 4、语言国际化 5、业务常见问题 三、自定义组件 2、组件开发规范 3、示例实践guide-tip 4、业务组件快速托管 一、组件库介绍 1、什么是…...
![](https://img-blog.csdnimg.cn/acab2b3b20fe4f58b7256f60007f9fdb.png)
网站和API支持HTTPS,最好在Nginx上配置
随着我们网站用户的增多,我们会逐渐意识到HTTPS加密的重要性。在不修改现有代码的情况下,要从HTTP升级到HTTPS,让Nginx支持HTTPS是个很好的选择。今天我们来讲下如何从Nginx入手,从HTTP升级到HTTPS,同时支持静态网站和…...
![](https://img-blog.csdnimg.cn/95b5ed9816244e1ca3863a602dd997c7.png)
UnitTest笔记: 拓展库DDT的使用
DDT (Data-Drivers- Tests) 允许使用不同的测试数据运行同一个测试用例,展示为不同的测试用例。 第一步: pip安装 ddt 第二步: 创建test_baidu_ddt.py 1. 测试类要使用ddt 修饰 2. 不同形式的参数化: 列表,字典&a…...
![](https://img-blog.csdnimg.cn/5c2d6cb97b1447b8821f56f86b98c04f.jpeg)
裂缝检测,只依赖OPENCV,基于YOLO8S
裂缝检测,只依赖OPENCV,YOLOV8S 现在YOLOV8S训练目标非常方便,可以直接转换成ONNX让OPENCV调用,支持C/PYTHON,原理很简单,自己找博客,有兴趣相互交流...
![](https://img-blog.csdnimg.cn/10811a83ac61452aa3d9f4dc46069c78.png)
python编程环境使用技巧3-程序打包pyinstaller
前言 在Python中,打包指的是将Python代码和相关资源(如配置文件、图像等)整合到一个可执行的文件或安装包中,以便于在其他环境中使用。 下面是使用pyinstaller进行打包的简要步骤: 1-安装pyinstaller:在命…...
![](https://www.ngui.cc/images/no-images.jpg)
Go 自学:defer关键字
我们可以使用defer关键字延迟代码的执行,相当于我们把代码放入一个stack中,遵循last in first out的原则输出代码。 package mainimport ("fmt" )func myDefer() {for i : 0; i < 5; i {defer fmt.Print(i)} }func main() {defer fmt.Prin…...
![](https://image.adlerian.xyz/file/fe4a34e4de1e4f7b3d708.png)
【云计算】Docker特别版——前端一篇学会
docker学习 文章目录 一、下载安装docker(一)Windows桌面应用安装(二)Linux命令安装 二、windows注册登录docker三、Docker的常规操作(一)、基本的 Docker 命令(二)、镜像操作(三)、容器的配置(四)、登录远程仓库 四、镜像管理(一…...
![](https://www.ngui.cc/images/no-images.jpg)
.net使用RabbitMQ小记
使用RabbitMQ的优点 1.性能全面,rabbitmq性能比较全面,是消息中间件的首选 2.高并发,rabbitmq实现语言是天生就具备高并发高可用的erlang语言 3.任务异步处理,将不需要同步处理的并且耗时长的操作由消息队列通知消息接受方进行异步…...
![](https://img-blog.csdnimg.cn/c330cef31fcd43c79e1a90a525797c3f.png)
layUI 中 穿梭框无法获取值的细节问题
初始化的时候一定要指定id,不然就会出现无法调用 获得右侧数据和实例重载的方法...
![](https://img-blog.csdnimg.cn/2fffddec318642c783dfe7fa7846e8e9.png)
Kaggle回归问题Mercedes——Benz Greener Manufacturing
目录 前言1 题目介绍2 数据清洗3 数据可视化分析4 模型训练5 源码 前言 这是我在大三选修课的课程设计,内容参考了Kaggle上高赞的代码,有详细批注,整体比较基础,结构相对完整,便于初学者学习。这个是一个回归问题&…...
![](https://img-blog.csdnimg.cn/img_convert/6c508e4bc4c823d5b2ab553d72b043a6.png)
天润融通「微藤大语言模型平台2.0」以知识驱动企业高速增长
8月23日,天润融通(又称“天润云”,2167.HK),正式发布「微藤大语言模型平台2.0」。 “大模型企业知识企业知识工程”。 “不能有效记录和管理知识的企业是不能持续进步的。在企业的生产流程中,相比于其他场景࿰…...
![](https://img-blog.csdnimg.cn/a8be99ce16304011a97c447b1daf6f90.png)
【BUG】解决安装oracle11g或12C中无法访问临时位置的问题
项目场景: 安装oracle时,到第二步出现oracle11g或12C中无法访问临时位置的问题。 解决方案: 针对客户端安装,在cmd中执行命令:前面加实际路径setup.exe -ignorePrereq -J"-Doracle.install.client.validate.cli…...
![](https://img-blog.csdnimg.cn/1fc283a0875249b3bd29bcc14bdc7fdb.png)
2. 使用IDEA创建Spring Boot Hello项目并管理依赖——Maven入门指南
前言:本文将介绍如何使用IDEA创建一个Spring Boot Hello项目,并通过Maven来管理项目的依赖。我们从项目的创建到代码的编写,再到项目的构建和运行,一步步演示了整个过程。 🚀 作者简介:作为某云服务提供商的…...
![](https://img-blog.csdnimg.cn/9a7c40fe874e46b6bcf707d931370830.png)
Python在电路课程中的应用
1 需求 课程中有大量的计算,电路方程、复数计算,之前都是用的MATLAB online,可现在要过期了,只能更换平台。 2 工具 https://www.online-python.com/ Python3 在线工具 | 菜鸟工具 (runoob.com) 3 Sinusoid 章节 涉及到复数计…...
![](https://www.ngui.cc/images/no-images.jpg)
Spark SQL join的三种实现方式
引言 join是SQL中的常用操作,良好的表结构能够将数据分散到不同的表中,使其符合某种规范(mysql三大范式),可以最大程度的减少数据冗余,更新容错等,而建立表和表之间关系的最佳方式就是join操作。 对于Spark来说有3种…...
![](https://images.cnblogs.com/cnblogs_com/keyrratuff/tf2.jpg)
做门户网站最重要的是什么意思/营业推广的方式有哪些
彻彻底底抛弃光驱的强力作品! 绿色软件 截图已经非常说明问题,会用的一看便知: Tuff的神奇小软盘1.2 下载地址http://www.zdxy.cn/tuff/tf.exe 已知问题: 1. 安装时因为要预先在各个分区创建备份空文件夹,如果你的分…...
![](https://www.oschina.net/img/hot3.png)
政务网站集约化建设/广州seo推荐
2019独角兽企业重金招聘Python工程师标准>>> 在前面随笔,我介绍了整个ABP优化过框架的分层模型,包括尽量简化整个ABP框架的各个层的关系,以及纳入一些基类的辅助处理,使得我们对应业务分层类或者接口尽可能减少代码&am…...
![](https://oscimg.oschina.net/oscnet/f5b59c800d81ae64ba9bf324805dfaf9477.jpg)
网页美工培训哪里好/深圳百度网站排名优化
开发四年只会写业务代码,分布式高并发都不会还做程序员? 近日,据外媒报道,Chromium 团队成员兼高级 Chrome 工程师 Peter Kasting 表示,Windows 10 的 Chrome 浏览器的暗色模式正在开发中。一直以来,Chro…...
![](https://images2018.cnblogs.com/blog/974776/201805/974776-20180505003738174-1281180334.png)
怎么做网站作业/网络推广公司专业网络
数组是一段线性分配的内存, 它通过整数计算偏移并访问其中的元素. 数组是一种性能出色的数据结构. 1.数组字面量 数组字面量提供了一种非常方便地创建新数组的表示法. 多个用逗号分隔的值的表达式. 数组字面量允许出现在任何表达式可以出现的地方. 数组的第一个值将获得属性名0…...
![](https://img-blog.csdnimg.cn/img_convert/2c50d18ce47a56b7011cc7d5156d5398.png)
o2o网站建设新闻/新媒体seo培训
按ctrl-d终止当前终端的标准输入并终止命令,通常会终止一个程序。这和ctrl-c不一样。ctrl-c是终止当前进程运行,无论是否有输入和输出。常用命令一ls-l :显示文件目录详细列表ls-F:显示文件类型信息ls -i : 查看当前目录的inode编号lsof:列出…...
![](https://img-blog.csdnimg.cn/img_convert/655bb07a6654a8ccaa1e3e9683f584f3.png)
开发一个网上商城/深圳seo公司
烟道口是开发商在建房子的时候,就已经预留好的,它的作用是用来排放厨房内的油烟。有的业主不知道自己家厨房烟道口的位置,那么厨房的烟道一般在什么位置?厨房烟道口位置可以改吗?也有的业主想要在烟道口贴瓷砖…...