网站首页 > 技术文章 正文
(原文作者:Elliot Forbes)
在本教程中,我们将研究如何以一种简单的方式使用Go-ORM或GORM 与sqlite3数据库进行交互。
ORM's对象关系管理器几乎充当我们开发人员与基础数据库技术之间的中介。它们使我们能够像通常那样在本质上使用对象的对象,然后保存这些对象而不必编写复杂的SQL语句。
在您不希望使用SQL但需要数据库的情况下,它们有效地降低了我们代码库的复杂性。
安装
为了安装jinzhu/gorm,您将必须执行以下 go get命令:
go get -u github.com/jinzhu/gorm
完成此操作后,您应该可以将导入jinzhu/gorm到任何基于go的项目中。
一个简单的例子
举例来说,假设您想编写一个go REST API,当某个API端点被命中时,它将新用户及其电子邮件保存到数据库中。
我们可以这样描述用户struct:
// Our User Struct
type User struct {
gorm.Model
Name string
Email string
}
一旦定义了User模型,我们就可以公开一个API端点,该端点可以将新用户保存到我们的sqlite3数据库中。
注意-如果您想知道如何开发自己的基于Go的REST API,请查看我的其他Go教程: 在Go中构建RESTful API
我们的API
因此,我们将创建一个非常简单的API,该API具有4个不同的CRUD 端点。这些将返回所有用户,添加新用户,删除用户并更新用户。
在我们的new的帮助下GORM,如果我们沿标准的原始SQL 路线走下去,这些端点的创建应该比以前简单得多。
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
)
func allUsers(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "All Users Endpoint Hit")
}
func newUser(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "New User Endpoint Hit")
}
func deleteUser(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Delete User Endpoint Hit")
}
func updateUser(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Update User Endpoint Hit")
}
func handleRequests() {
myRouter := mux.NewRouter().StrictSlash(true)
myRouter.HandleFunc("/users", allUsers).Methods("GET")
myRouter.HandleFunc("/user/{name}", deleteUser).Methods("DELETE")
myRouter.HandleFunc("/user/{name}/{email}", updateUser).Methods("PUT")
myRouter.HandleFunc("/user/{name}/{email}", newUser).Methods("POST")
log.Fatal(http.ListenAndServe(":8081", myRouter))
}
func main() {
fmt.Println("Go ORM Tutorial")
// Handle Subsequent requests
handleRequests()
}
然后,我们可以通过运行来启动这个新的API go run main.go。该API代表了我们用来构建ORM基础解决方案的基础。
SQLite3数据库创建和自动模式迁移
我们项目的下一步是创建数据库。就本教程而言,sqlite3由于其易于使用和设置,我们将使用数据库。
注意-GORM通过切换方言,您可以相当轻松地交换使用另一种数据库技术。
我们可以GORM通过调用在数据库中自动创建User表db.AutoMigrate(&User{})。这省去了编写表创建SQL脚本的麻烦。
// our initial migration function
func initialMigration() {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
fmt.Println(err.Error())
panic("failed to connect database")
}
defer db.Close()
// Migrate the schema
db.AutoMigrate(&User{})
}
func main() {
fmt.Println("Go ORM Tutorial")
// Add the call to our new initialMigration function
initialMigration()
handleRequests()
}
更新我们的所有用户端点
在我们的allUsers()函数中,我们基本上想查询User 数据库中的所有记录,然后将其编码为编码JSON并将其作为响应返回。
我们可以通过调用查询数据库中的所有用户db.Find(&users)。
func allUsers(w http.ResponseWriter, r *http.Request) {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
var users []User
db.Find(&users)
fmt.Println("{}", users)
json.NewEncoder(w).Encode(users)
}
更新我们的新用户终端
现在,我们要更新我们的newUser()功能,以便它可以将新用户插入我们的数据库。这将需要根据向我们的API发出的请求的查询参数解析用户名和电子邮件。
这将必须解析端点的路径参数,然后使用这些路径参数来填充一个新User对象,然后sqlite通过调用,将其插入 数据库中,db.Create(&User{Name: name, Email: email})如下所示:
func newUser(w http.ResponseWriter, r *http.Request) {
fmt.Println("New User Endpoint Hit")
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
vars := mux.Vars(r)
name := vars["name"]
email := vars["email"]
db.Create(&User{Name: name, Email: email})
fmt.Fprintf(w, "New User Successfully Created")
}
我们的删除用户端点
我们的deleteUser()函数将删除与name 通过path参数传入的用户匹配的用户。这是相当基本的,不能处理数据库中存在多个用户且用户相同的情况,但是在该项目中它是一个很好的例子。
func deleteUser(w http.ResponseWriter, r *http.Request) {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
vars := mux.Vars(r)
name := vars["name"]
var user User
db.Where("name = ?", name).Find(&user)
db.Delete(&user)
fmt.Fprintf(w, "Successfully Deleted User")
}
我们的更新用户端点
在需要更新user数据库中现有数据的奇怪情况下,当然可以使用轻松得多GORM。从本质上讲,您要做的就是使用唯一的来搜索给定的用户 name。
拥有该用户后,您只需User像通常使用标准go对象一样简单地更新对象。对对象和更新感到满意之后,您就可以调用db.Save(&user)将所有更改保存到数据库中。
func updateUser(w http.ResponseWriter, r *http.Request) {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
vars := mux.Vars(r)
name := vars["name"]
email := vars["email"]
var user User
db.Where("name = ?", name).Find(&user)
user.Email = email
db.Save(&user)
fmt.Fprintf(w, "Successfully Updated User")
}
完整的源代码
如果您需要该项目的完整源代码,请查看以下要点:https : //gist.github.com/elliotforbes/e241eaa8cc9d7bf3ec75b333e891d422
结论
希望您发现本教程有用,并且向您展示了在使用数据库时使用ORM的优势。如果这样做有帮助,或者您认为您需要进一步的帮助,请在下面的评论部分中告诉我!
原文地址:
https://tutorialedge.net/golang/golang-orm-tutorial/
猜你喜欢
- 2024-09-09 混合云资产管理项目(二)(混合云存储产品有哪些)
- 2024-09-09 Go语言进阶之Go语言高性能Web框架Iris项目实战-完善用户管理EP04
- 2024-09-09 数据库与 Go 的交互(go数据库和kegg数据库)
- 2024-09-09 七爪源码:N+1 查询如何烧毁您的数据库
- 2024-09-09 Go的安全编程和防御性编程(防止代码注入)
- 2024-09-09 Vue3+Go 仿抖音项目架构设计与实现
- 2024-09-09 腾讯Go安全指南(腾讯官网最新安全公告)
- 2024-09-09 Grails指南24查询高阶(grails中文参考手册)
- 2024-09-09 Redis优化高并发下的秒杀性能(redis秒杀高并发代码)
- 2024-09-09 10.Go语言编写个人博客 文章分类(基于golang的个人博客系统)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)