Golang高级语法-数据库操作

本文将介绍如何使用Golang进行数据库操作。我们将涵盖连接、创建和删除数据库,创建表格,以及插入、查询、更新和删除数据等操作。

1 连接数据库

首先,我们需要使用第三方库来连接数据库。在本文中,我们将使用database/sql库和mysql驱动来连接MySQL数据库。请确保已经安装了MySQL数据库和驱动程序。

package main

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

func main() {
    // 打开数据库连接
    db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/database_name")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    // 测试连接
    err = db.Ping()
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("Successfully connected to MySQL database")
}

在上面的代码中,我们首先导入了database/sqlgithub.com/go-sql-driver/mysql两个包。然后,我们通过调用sql.Open()函数来打开数据库连接。此函数需要两个参数:第一个参数是驱动名称,这里我们使用mysql驱动;第二个参数是连接字符串,它包括用户名、密码、主机名和端口以及数据库名称。如果连接失败,我们将会抛出一个错误。最后,我们通过调用db.Ping()函数来测试连接是否正常工作。如果出现错误,则会抛出异常。

2 创建和删除数据库

在Golang中,我们可以使用CREATE DATABASEDROP DATABASE语句来创建和删除数据库。

// 创建数据库
_, err = db.Exec("CREATE DATABASE IF NOT EXISTS test_db")
if err != nil {
    panic(err.Error())
}
fmt.Println("Successfully created database")

// 删除数据库
_, err = db.Exec("DROP DATABASE IF EXISTS test_db")
if err != nil {
    panic(err.Error())
}
fmt.Println("Successfully dropped database")

在上面的代码中,我们首先使用db.Exec()函数来执行SQL语句,创建一个名为test_db的数据库。如果数据库已经存在,则不会执行创建操作。然后,我们再次使用db.Exec()函数来删除名为test_db的数据库。如果数据库不存在,则不会执行删除操作。

3 创建和删除表格

在Golang中,我们可以使用CREATE TABLEDROP TABLE语句来创建和删除表格。

// 创建表格
_, err = db.Exec("CREATE TABLE IF NOT EXISTS user (id INT, name VARCHAR(50), age INT)")
if err != nil {
    panic(err.Error())
}
fmt.Println("Successfully created table")

// 删除表格
_, err = db.Exec("DROP TABLE IF EXISTS user")
if err != nil {
    panic(err.Error())
}
fmt.Println("Successfully dropped table")

在上面的代码中,我们使用db.Exec()函数来执行SQL语句,创建一个名为user的表格。表格包括三个列:idnameage。如果表格已经存在,则不会执行创建操作。然后,我们再次使用db.Exec()函数来删除名为user的表格。如果表格不存在,则不会执行删除操作。

4 插入数据

在Golang中,我们可以使用INSERT INTO语句来向表格中插入数据。

// 插入数据
stmt, err := db.Prepare("INSERT INTO user(id, name, age) VALUES (?, ?, ?)")
if err != nil {
    panic(err.Error())
}
defer stmt.Close()

_, err = stmt.Exec(1, "Alice", 25)
if err != nil {
    panic(err.Error())
}
fmt.Println("Successfully inserted data")

在上面的代码中,我们首先使用db.Prepare()函数来准备插入语句。插入语句包括三个问号占位符,分别对应idnameage列。然后,我们通过调用stmt.Exec()函数来执行插入操作,并传递三个参数:1Alice25。最后,我们通过调用defer stmt.Close()函数来关闭语句。

5 查询数据

在Golang中,我们可以使用SELECT语句来查询表格中的数据。

// 查询数据
rows, err := db.Query("SELECT id, name, age FROM user")
if err != nil {
    panic(err.Error())
}
defer rows.Close()

for rows.Next() {
    var id int
    var name string
    var age int
    err = rows.Scan(&id, &name, &age)
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("id: %d, name: %s, age: %d\n", id, name, age)
}

在上面的代码中,我们使用db.Query()函数来执行查询语句,查询表格中的数据。然后,我们通过调用rows.Close()函数来关闭查询结果集。接着,我们使用rows.Next()函数来遍历结果集中的每一行数据。对于每一行数据,我们使用rows.Scan()函数来读取数据,并将其赋值给对应的变量。最后,我们通过调用fmt.Printf()函数来打印结果。

6 更新数据

在Golang中,我们可以使用UPDATE语句来更新表格中的数据。

// 更新数据
stmt, err = db.Prepare("UPDATE user SET age = ? WHERE id = ?")
if err != nil {
    panic(err.Error())
}
defer stmt.Close()

_, err = stmt.Exec(26, 1)
if err != nil {
    panic(err.Error())
}
fmt.Println("Successfully updated data")

在上面的代码中,我们使用db.Prepare()函数来准备更新语句。更新语句包括两个问号占位符,分别对应ageid列。然后,我们通过调用stmt.Exec()函数来执行更新操作,并传递两个参数:261。最后,我们通过调用defer stmt.Close()函数来关闭语句。

7 删除数据

在Golang中,我们可以使用DELETE FROM语句来删除表格中的数据。

// 删除数据
stmt, err = db.Prepare("DELETE FROM user WHERE id = ?") 
if err != nil { 
    panic(err.Error()) 
} 
defer stmt.Close()

_, err = stmt.Exec(1)
if err != nil { 
    panic(err.Error()) 
} 
fmt.Println("Successfully deleted data")

在上面的代码中,我们使用db.Prepare()函数来准备删除语句。删除语句包括一个问号占位符,对应id列。然后,我们通过调用stmt.Exec()函数来执行删除操作,并传递一个参数:1。最后,我们通过调用defer stmt.Close()函数来关闭语句。


在Golang中,使用ORM(Object Relational Mapping)框架可以很方便地操作数据库。gorm是一款常用的Golang ORM框架,它支持多种数据库(如MySQL、PostgreSQL等),提供了丰富的API和查询语句,可以帮助开发人员快速地进行数据库操作。

在本文中,我们将学习如何使用gorm框架连接MySQL数据库,并进行一些基本的数据库操作,如插入、查询、更新和删除数据。

8 依赖安装

在开始之前,需要先安装gorm和mysql驱动。可以使用以下命令进行安装:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

9 连接数据库

在使用gorm进行数据库操作之前,需要先连接数据库。下面是连接MySQL数据库的示例代码:

package main

import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local" // 数据库连接信息
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) // 连接数据库
if err != nil {
panic("failed to connect database")
}

// 此处省略关闭数据库连接的代码
}

在上述代码中,dsn变量存储了数据库连接信息,其中包括用户名、密码、主机地址、端口号、数据库名等。使用gorm.Open()函数连接数据库,如果连接成功,则返回db对象,否则会抛出异常。

10 定义模型

在gorm中,模型是映射到数据库表的结构体。可以通过gorm.Model结构体嵌入来定义一个基本的模型,它包含了id、created_at和updated_at等常用字段。

下面是一个定义user模型的示例代码:

package main

import (
"gorm.io/gorm"
)

type User struct {
gorm.Model // 嵌入gorm.Model结构体
Name       string
Age        int
}

在上述代码中,User结构体嵌入了gorm.Model结构体,可以自动添加id、created_at和updated_at等字段。同时,User结构体也定义了Name和Age两个字段,它们将映射到数据库表中的name和age字段。

11 创建表

在gorm中,可以使用AutoMigrate()方法自动创建表,也可以使用Create()方法手动创建表。

下面是使用AutoMigrate()方法创建user表的示例代码:

package main

import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// 自动创建表
db.AutoMigrate(&User{})

// 此处省略关闭数据库连接的代码
}

在上述代码中,使用db.AutoMigrate()方法创建user表,参数是User结构体。如果表已经存在,则会自动更新表结构。

12 插入数据

在gorm中,可以使用Create()方法向数据库中插入数据。

下面是向user表中插入一条记录的示例代码:

package main

import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// 插入数据
user := User{Name: "Alice", Age: 18}
result := db.Create(&user)
if result.Error != nil {
panic(result.Error)
}

// 此处省略关闭数据库连接的代码
}

在上述代码中,首先创建一个User对象,然后使用db.Create()方法将该对象插入到user表中。

13 查询数据

在gorm中,可以使用Find()方法查询数据。

下面是查询所有user记录的示例代码:

package main

import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// 查询数据
var users []User
result := db.Find(&users)
if result.Error != nil {
panic(result.Error)
}

// 打印查询结果
fmt.Println(users)

// 此处省略关闭数据库连接的代码
}

在上述代码中,使用db.Find()方法查询所有的user记录,并将查询结果存储在一个User类型的slice中。

14 更新数据

在gorm中,可以使用Model()和Updates()方法更新数据。

下面是将id为1的user记录的age字段更新为20的示例代码:

package main

import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// 更新数据
result := db.Model(&User{}).Where("id = ?", 1).Updates(User{Age: 20})
if result.Error != nil {
panic(result.Error)
}

// 此处省略关闭数据库连接的代码
}

在上述代码中,使用db.Model()方法指定模型(User{})和查询条件(Where("id = ?", 1)),然后使用Updates()方法更新age字段。

15 删除数据

在gorm中,可以使用Delete()方法删除数据。

下面是删除id为1的user记录的示例代码:

package main

import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// 删除数据
result := db.Delete(&User{}, 1)
if result.Error != nil {
panic(result.Error)
}

// 此处省略关闭数据库连接的代码
}

在上述代码中,使用db.Delete()方法删除id为1的user记录。

16 总结

gorm是一个功能强大的ORM库,支持多种数据库,可以大大简化数据库操作。在本文中,我们介绍了gorm的一些基本用法,包括创建表、插入数据、查询数据、更新数据和删除数据。如果你需要更深入的学习gorm,可以查看官方文档:https://gorm.io/docs/。

完整的示例代码如下:

package main

import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

type User struct {
ID   uint
Name string
Age  uint
}

func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// 创建表
db.AutoMigrate(&User{})

// 插入数据
user := User{Name: "Alice", Age: 18}
result := db.Create(&user)
if result.Error != nil {
panic(result.Error)
}

// 查询数据
var users []User
result = db.Find(&users)
if result.Error != nil {
panic(result.Error)
}
fmt.Println(users)

// 更新数据
result = db.Model(&User{}).Where("id = ?", 1).Updates(User{Age: 20})
if result.Error != nil {
panic(result.Error)
}

// 删除数据
result = db.Delete(&User{}, 1)
if result.Error != nil {
panic(result.Error)
}

// 关闭数据库连接
sqlDB, err := db.DB()
if err != nil {
panic(err)
}
sqlDB.Close()
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容