golang mysql

驱动

cpp 复制代码
"github.com/go-sql-driver/mysql"

使用到的方法

cpp 复制代码
func sql.Open(driverName string, dataSourceName string) (*sql.DB, error) 

func (*sql.DB).Prepare(query string) (*sql.Stmt, error)//使用DB.Prepare预编译并使用参数化查询,对预编译的SQL语句进行缓存,省去了每次解析优化该SQL语句的过程
func (*sql.Stmt).Query(args ...any) (*sql.Rows, error)

func (*sql.DB).Query(query string, args ...any) (*sql.Rows, error)

func (*sql.Rows).Next() bool
func (*sql.Rows).Scan(dest ...any) error

单行查询

cpp 复制代码
package main

import (
	"database/sql"
	"fmt"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

var db60 *sql.DB //数据库连接和交互的类型,可以理解为句柄

func init() { 
	constr := "otoyix:otoyix@tcp(192.168.0.60:3306)/test1"
	var err error
	db60, err = sql.Open("mysql", constr) //建立与数据库的链接
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	db60.SetConnMaxLifetime(time.Second * 60) //超时时间60s
	db60.SetMaxOpenConns(0)                   //最大链接数,0为无限制
	db60.SetMaxIdleConns(10)                  //设置空闲链接数
	// return db60
}

type Student struct {
	id        int
	name      string
	age       int
	birthdate string
}

func main() {
	row := db60.QueryRow("select * from student where id > ? limit ?", 0, 1) //返回结果行

	student := Student{}
	err := row.Scan(&student.id, &student.name, &student.age, &student.birthdate)
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	fmt.Printf("student: %v\n", student)

}

多行查询 - 预编译-参数化

cpp 复制代码
package main

import (
	"database/sql"
	"fmt"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

var db60 *sql.DB //数据库连接和交互的类型,可以理解为句柄

func init() { 
	constr := "otoyix:otoyix@tcp(192.168.0.60:3306)/test1"
	var err error
	db60, err = sql.Open("mysql", constr) //建立与数据库的链接
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	db60.SetConnMaxLifetime(time.Second * 60) //超时时间60s
	db60.SetMaxOpenConns(0)                   //最大链接数,0为无限制
	db60.SetMaxIdleConns(10)                  //设置空闲链接数
	// return db60
}

type Student struct {
	id        int
	name      string
	age       int
	birthdate string
}

func main() {
	stmt, err := db60.Prepare("select * from student where id > ? limit ?") 
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	rows, err := stmt.Query(0, 2)
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}

	student := Student{}
	for rows.Next() {
		err = rows.Scan(&student.id, &student.name, &student.age, &student.birthdate)
		if err != nil {
			panic(err)
		}
		fmt.Printf("student: %v\n", student)
	}

}

非查询

源代码

cpp 复制代码
func (db *DB) Exec(query string, args ...any) (Result, error)

type Result interface {
	// LastInsertId returns the integer generated by the database
	// in response to a command. Typically this will be from an
	// "auto increment" column when inserting a new row. Not all
	// databases support this feature, and the syntax of such
	// statements varies.
	LastInsertId() (int64, error)

	// RowsAffected returns the number of rows affected by an
	// update, insert, or delete. Not every database or database
	// driver may support this.
	RowsAffected() (int64, error)
}

实现

cpp 复制代码
	Result, err := db60.Exec("delete from student where id >1")
	fmt.Println(Result.RowsAffected())
	//返回受影响的行 与err

--------------end

相关推荐
大黄说说几秒前
打通异构数据库:PostgreSQL 通过 mysql_fdw 实现 MySQL 透明查询实战
数据库·mysql·postgresql
.ZGR.1 分钟前
认识数据结构:图——无人机防空平台的“衍生品”
java·开发语言·数据结构
波波00711 分钟前
Native AOT 能改变什么?.NET 预编译技术深度剖析
开发语言·.net
wkm95614 分钟前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
晚风吹长发26 分钟前
初步了解Linux中的线程同步问题及线程安全和死锁与生产消费者模型
linux·运维·服务器·开发语言·数据结构·安全
学嵌入式的小杨同学30 分钟前
【Linux 封神之路】进程进阶实战:fork/vfork/exec 函数族 + 作业实现(含僵尸进程解决方案)
linux·开发语言·vscode·嵌入式硬件·vim·软件工程·ux
fengfuyao98538 分钟前
基于MATLAB/Simulink的车辆自适应巡航控制(ACC)实现
开发语言·matlab
海盗123442 分钟前
WPF上位机组件开发-设备状态运行图基础版
开发语言·c#·wpf
看我干嘛!43 分钟前
python第四次作业
开发语言·python