2021-05-12

Posted 涂涂努力ing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-05-12相关的知识,希望对你有一定的参考价值。

GoLang数据库操作 CRUD

本文是本人第一次尝试用GO来操控数据库,做一些简单的增、删、改、查的操作
着重于记载尝试过程中遇到的问题和如何解决这些问题的方法

安装mysql驱动遇到的一些问题

  1. 以mysql为例,Go本身不提供具体数据库驱动,只提供驱动接口和管理,因此需要导入包的方式来获取驱动。
    需要的包如图 log为自选
    图片位置为mysql驱动,但是直接输入如图的包,IDE红,提示无法导入
    解决方法:
    在GoLand中点击左下角的Terminal,在Terminal中输入***go get -u github.com/go-sql-driver/mysql***
    有可能会出现如下错误

    原因是没有正常编译所编辑的文件
    解决方法:
    在Terminal中编译文件:e.g.文件hello.go
    go mod init hello
    如果显示mod文件已经存在,可以手动删除已经存在的go.mod文件
    然后再输入***go get -u github.com/go-sql-driver/mysql***
    (编译后驱动包在导入处依然可能是红色的,但是不影响运行,在我尝试中是可以正常操作数据库的)

链接数据库

在开始CRUD前,首先需要链接数据库,代码如下

func db_connection(){
	db, err :=sql.Open("mysql", "root:rootp(localhost:3306)/test") /** 格式: mysql用户名:mysql密码 test为数据库名 */
	if err != nil {
		fmt.Println(">>> fail to connect to db <<<")
	}
	defer db.Close()
	fmt.Println(">>> succeed to connect to db <<<")
}

结构体完成数据库与程序变量的映射

我的数据库中有一张表 user,结构如图
数据库表结构图

type User struct{
	id int
	FirstName string
	LastName string
	gender string
	age int
	email string
}

根据数据库中对应表的结构来创建结构体

Create 增加

func insert(db *sql.DB) {
	stmt, err := db.Prepare("INSERT INTO user(FirstName,LastName,gender,age,email) values('Andy','Lou','Male',60,'Andy@Andy')")
	if err != nil {
		panic(err)
	}
	defer stmt.Close()
	result, err := stmt.Exec()
	if err != nil {
		panic(err)
		fmt.Println("Add Fail")
	}
	id,err := result.LastInsertId()
	fmt.Println("Successfully Added user with id: ",id)

	defer db.Close()
}

Retrieve 检索

func query(db *sql.DB){
	rows,err := db.Query("Select * from user ")
	if err !=nil{
		panic(err)
	}
	for rows.Next(){
		var id int
		var fn string
		var ln string
		var gen string
		var age int
		var email string
		if err := rows.Scan(&id,&fn,&ln,&gen,&age,&email); err!=nil{
			log.Fatal(err)
		}
		fmt.Printf("User id: %d\\tFistName: %s\\tLastName: %s\\tGender: %s\\tAge: %d\\tEmail: %s\\n",id,fn,ln,gen,age,email)

	}
	defer rows.Close()
	defer db.Close()
}

Update 更新

func update(db *sql.DB){
	stmt,err := db.Prepare("UPDATE user SET LastName ='Liu' WHERE id=5")
	if err!=nil{
		panic(err)
	}
	_, err = stmt.Exec()
	if err!=nil{
		fmt.Println("Update Fail")
		panic(err)
	}
	fmt.Println("Successfully Updated")
}

Delete删除

func delete(db *sql.DB){
	stmt,err := db.Prepare("DELETE FROM user WHERE id=5")
	if err !=nil{
		panic(err)
	}
	result,err:=stmt.Exec()
	if err!=nil{
		panic(err)
		fmt.Println("Delete fail")
	}
	_, err = result.LastInsertId()
	fmt.Println(" Successfully Delete")
}

总结

对GO还在学习阶段,分享内容比较基础,大多是我在学习中碰见的问题
后续还会风险更多细节和新的项目
希望熟悉GO的朋友指出错误,一起探讨
祝大家学习愉快,生活愉快 🌷

以上是关于2021-05-12的主要内容,如果未能解决你的问题,请参考以下文章

2021-05-12

python中日期字符串与datetime类型的相互转换

2021-05-12

2021-05-12

2021-05-12

2021-05-12