golang使用database/mysql连接mysql,并进行操作

柔光的暖阳◎ 2022-09-15 12:43 239阅读 0赞
  • 结构体定义(所有代码到在mysql包下)

    1. type User struct {
    2. Id int64
    3. Name string
    4. Age int
    5. Address string
    6. CreateTime time.Time
    7. }
  • 1、连接mysql数据库

    1. package mysql
    2. import (
    3. "context"
    4. "database/sql"
    5. "fmt"
    6. _ "github.com/go-sql-driver/mysql"
    7. "github.com/prometheus/common/log"
    8. "sync"
    9. )
    10. var (
    11. Client *sql.DB
    12. ctx = context.Background()
    13. once sync.Once
    14. )
    15. func InitMysqlClient(){
    16. // ${用户名}:${密码}@tcp${数据库地址}/${数据库}
    17. dataSourceName :=fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8",
    18. "", "", "", "")
    19. log.Debugf("%s\n", dataSourceName)
    20. once.Do(func(){
    21. db, err := sql.Open("mysql", dataSourceName)
    22. if err != nil {
    23. log.Errorf("数据库打开出现了问题:%s", err)
    24. }
    25. // 最大空闲连接数
    26. if flag.MysqlMaxIdle != 0 {
    27. db.SetMaxIdleConns(flag.MysqlMaxIdle)
    28. }
    29. // 最大连接数
    30. if flag.MysqlMaxConn != 0 {
    31. db.SetMaxOpenConns(flag.MysqlMaxConn)
    32. }
    33. // 尝试与数据库建立连接(校验dsn是否正确)
    34. err = db.Ping()
    35. if err != nil {
    36. log.Errorf("数据库连接出现了问题:%s", err)
    37. }
    38. Client = db
    39. })
    40. log.Info("mysql connection success !!!")
    41. }
    42. //注: 请在main方法中初始化mysql客户端,调用InitMysqlClient()函数
  • 2、插入单条数据到mysql(事务)

    1. func Insert(user *User) (bool){
    2. db := Client
    3. // 开启事务
    4. tx, err := db.Begin()
    5. if err != nil{
    6. log.Error("tx begin work fail")
    7. return false
    8. }
    9. //准备sql语句
    10. stmt, err := tx.Prepare("INSERT INTO user (`name`, `age`, `address`,`create_time`) " +
    11. "VALUES (?, ?, ?, ?)")
    12. if err != nil{
    13. log.Error("Prepare fail")
    14. return false
    15. }
    16. //将参数传递到sql语句中并且执行
    17. res, err := stmt.Exec(user.Name,
    18. user.Age,
    19. user.Address,
    20. time.Now().Format(time.RFC3339))
    21. if err != nil{
    22. tx.Rollback()
    23. log.Errorf("Exec fail, err:%s", err)
    24. return false
    25. }
    26. //将事务提交
    27. tx.Commit()
    28. //获得上一个插入自增的id
    29. log.Info(res.LastInsertId())
    30. if err != nil {
    31. log.Errorf("user info insert mysql failed, err[%s]", err)
    32. }
    33. return true
    34. }
  • 3、插入列表数据(仅供参考)

    1. func Inserts(users map[string]*User) (bool){
    2. // 处理mysql语句,入库
    3. sqlStr :="INSERT INTO user (`name`, `age`, `address`, `create_time`) VALUES "
    4. var vals []interface{ }
    5. for _, row := range users {
    6. sqlStr += "(?, ?, ?, ?),"
    7. vals = append(vals,
    8. row.name,
    9. row.age,
    10. row.address,
    11. time.Now().Format(time.RFC3339))
    12. }
    13. db := Client
    14. // 开启事务
    15. tx, err := db.Begin()
    16. if err != nil{
    17. log.Error("tx begin work fail")
    18. return false
    19. }
    20. //准备sql语句
    21. stmt, err := tx.Prepare(sqlStr)
    22. if err != nil{
    23. log.Error("Prepare fail")
    24. return false
    25. }
    26. //将参数传递到sql语句中并且执行
    27. res, err := stmt.Exec(vals...)
    28. if err != nil{
    29. tx.Rollback()
    30. log.Errorf("Exec fail, err:%s", err)
    31. return false
    32. }
    33. //将事务提交
    34. tx.Commit()
    35. //获得上一个插入自增的id
    36. log.Debug(res.LastInsertId())
    37. if err != nil {
    38. log.Errorf("user info inserts failed, err:%s", err)
    39. }
    40. return true
    41. }
  • 4、查询语句,返回单条数据

    1. func SearchByName(name string) (User, error) {
    2. var user User
    3. db :=Client
    4. err := db.QueryRow("SELECT id, name, age, address, create_time FROM user " +
    5. "WHERE name = ?", name).Scan(&user.Id, &user.Name,
    6. &user.Age, &user.Address, &user.CreateTime)
    7. if err != nil{
    8. log.Warnf("search user info failed, err:%s", err)
    9. }
    10. return user, err
    11. }
  • 5、查询列表

    1. func SelectAllUser(address string) ([]User) {
    2. db :=Client
    3. //执行查询语句
    4. rows, err := db.Query("SELECT * from user WHERE address = ?", address)
    5. if err != nil{
    6. fmt.Println("查询出错了")
    7. }
    8. var users []User
    9. //循环读取结果
    10. for rows.Next(){
    11. var user bean.User
    12. //将每一行的结果都赋值到一个user对象中
    13. err := rows.Scan(&user.Id, &user.Name, &user.Age,&user.Address)
    14. if err != nil {
    15. fmt.Println("rows fail")
    16. }
    17. //将user追加到users的这个数组中
    18. users = append(users, user)
    19. }
    20. return users
    21. }
  • 更新数据(删除数据同理,更换下sql语句即可)

    1. func Update(address string, name string) (bool) {
    2. db :=Client
    3. //开启事务
    4. tx, err := db.Begin()
    5. if err != nil{
    6. log.Error("tx begin work fail")
    7. return false
    8. }
    9. //准备sql语句
    10. stmt, err := tx.Prepare("UPDATE user SET address = ? WHERE name = ?")
    11. if err != nil{
    12. log.Error("Prepare fail")
    13. return false
    14. }
    15. //设置参数以及执行sql语句
    16. _, err = stmt.Exec(address, name )
    17. if err != nil{
    18. tx.Rollback()
    19. log.Errorf("Exec fail, err:%s", err)
    20. return false
    21. }
    22. //提交事务
    23. tx.Commit()
    24. if err != nil {
    25. log.Errorf("update user info failed, name:[%s]", name)
    26. }
    27. return true
    28. }

发表评论

表情:
评论列表 (有 0 条评论,239人围观)

还没有评论,来说两句吧...

相关阅读