1、下载Go-Mysql-Driver

  1. go get github.com/go-sql-driver/mysql

2、引入import

  1. import(
  2. "database/sql"
  3. _"github.com/Go-SQL-Driver/MySQL"
  4. "log"
  5. "strconv"
  6. //"reflect" //获取变量类型用
  7. )

3、增:

  1. func main (){
  2. //insert
  3. name := "name"
  4. pwd := "password"
  5. nickname := "nickname"
  6. db,err := sql.Open("mysql","go_mysql_user:go_mysql_pwd@tcp(localhost:3306)/go_mysql?charset=utf8")
  7. if err != nil{
  8. panic(err.Error())
  9. log.Println(err)
  10. return
  11. }
  12. defer db.Close() //只有在前面用了 panic[抛出异常] 这时defer才能起作用,如果链接数据的时候出问题,他会往err写数据。defer:延迟,这里立刻申请了一个关闭sql 链接的操作,defer 后的方法,或延迟执行。在函数抛出异常一会被执行
  13. insert_sql := "insert into users (name,pwd,nickname) value (?,?,?),(?,?,?),(?,?,?),(?,?,?)"
  14. stmt,err := db.Prepare(insert_sql) //准备一个sql操作,返回一个*Stmt,用户后面的执行,这个Stmt可以被多次执行,或者并发执行
  15. /*
  16. * 这个stmt的主要方法:Exec、Query、QueryRow、Close
  17. */
  18. if err != nil {
  19. log.Println(err)
  20. return
  21. }
  22. res,err := stmt.Exec(name,pwd,nickname,name,pwd,nickname,name,pwd,nickname,name,pwd,nickname)
  23. if err != nil {
  24. log.Println(err)
  25. return
  26. }
  27. lastInsertId,err := res.LastInsertId() //批量插入的时候LastInserId返回的是第一条id,单条插入则返回这条的id
  28. //lastInsertId,err := res.RowsAffected() //插入的是后RowsAffected 返回的是插入的条数
  29. if err != nil {
  30. log.Println(err)
  31. return
  32. }
  33. //log.Println(reflect.TypeOf(lastInsertId)) //打印变量类型
  34. last_insert_id_string := strconv.FormatInt(lastInsertId,) //int64 转string 需要引入 strconv包
  35. log.Println("lastInsertId = " + last_insert_id_string)
  36. }

4、删

  1. func main (){
  2. //delete
  3. del_sql := "delete from users where id=?"
  4. del_stmt,del_err := db.Prepare(del_sql)
  5. del_stmt.Exec()//不返回任何结果
  6. }

5、改

  1. func main (){
  2. //update
  3. update_sql := "update users set name=? where id=?"
  4. update_stmt,update_err := db.Prepare(update_sql)
  5. if update_err != nil {
  6. log.Println(update_err)
  7. return;
  8. }
  9. update_res,update_err := update_stmt.Exec("username",)
  10. if update_err != nil {
  11. log.Printf("%v",update_err)
  12. return
  13. }
  14. affect_count,_ := update_res.RowsAffected() //返回影响的条数,注意有两个返回值
  15. log.Printf("%v",affect_count)
  16. }

6、查一条

  1. type User struct{
  2. id int
  3. name string
  4. pwd string
  5. nickname string
  6. }
  7.  
  8. func main (){
  9. //select
  10. var user User
  11. select_sql := "select * from users where id > ?"
  12. select_err := db.QueryRow(select_sql,).Scan(&user.id,&user.name,&user.pwd,&user.nickname)//查询一条,返回一条结果。并赋值到user这个结构体类型的变量中,就算查询到的是多条,单返回的还是一条
  13. if select_err != nil {//如果没有查询到任何数据就进入if中err:no rows in result set
  14. log.Println(select_err)
  15. return
  16. }
  17. log.Println(user)
  18. }

7、查多条

  1. func main (){
  2. //查询多条
  3. select_rows,select_err := db.Query(select_sql,)
  4. if select_err != nil {
  5. log.Println(select_err)
  6. return
  7. }
  8. defer select_rows.Close()
  9. for select_rows.Next(){
  10. var id int
  11. var name string
  12. var pwd string
  13. var nickname string
  14. if err := select_rows.Scan(&id,&name,&pwd,&nickname); err != nil {
  15. log.Println(err)
  16. return
  17. }
  18. log.Printf("id=%v,name=%v,pwd=%v,nickname=%v",id,name,pwd,nickname)
  19. }
  20.  
  21. }

8、事务

  1. func main (){
  2.  
  3. //事务
  4. tx,err := db.Begin() //声明一个事务的开始
  5. if err != nil {
  6. log.Println(err)
  7. return
  8. }
  9. insert_sql := "insert into users (name,pwd,nickname) value(?,?,?)"
  10. insert_stmt,insert_err := tx.Prepare(insert_sql)
  11. if insert_err != nil {
  12. log.Println(insert_err)
  13. return
  14. }
  15. insert_res,insert_err := insert_stmt.Exec("tx_name","tx_pwd","tx_nickname")
  16. last_insert_id,_ := insert_res.LastInsertId()
  17. log.Println(last_insert_id)
  18. defer tx.Rollback() //回滚之前上面的last_login_id是有的,但在回滚后该操作没有被提交,被回滚了,所以上面打印的Last_login_id的这条数据是不存在于数据库表中的
  19. //tx.Commit() //这里提交了上面的操作,所以上面的执行的sql 会在数据库中产生一条数据
  20.  
  21. }

9、总结

  1. db,err := sql.Open("mysql","数据库登录名:数据库密码@tcp(服务器:端口)/数据库名?charset=utf8") 对应修改;
  2. defer db.Close()  defer 是延迟或异常或者该方法结束时执行的操作。这里表示有异常就关闭db 可与 panic(err.Error())=》抛出异常。配合使用。一种情况不可执行=》你的方法进入了死循环,该方法不会结束与异常则不可执行。
  3. LastInsertId()  获取插入第一条的id  有用
  4. RowsAffected()  获取影响/插入的条数  有用
  5. reflect.TypeOf(i)  reflect包中TypeOf 返回的是变量i的类型
  6. strconv.FormatInt(int64位变量,)  strconv包中FormatIntint64位的变量转为string

10、附github地址

  1. https://github.com/go-sql-driver/mysql

Go-MySQL-Driver的更多相关文章

  1. Qt5.7中使用MySQL Driver

    Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可. 如果没有安装,可以采取自己编译的方式. 在Qt的源码包 ...

  2. com.mysql.jdbc.Driver 与 org.gjt.mm.mysql.Driver的区别

    com.mysql.jdbc.Driver的前身是org.gjt.mm.mysql.Driver,现在主要用com.mysql.jdbc.Driver,但为了保持兼容性保留了org.gjt.mm.my ...

  3. MySQL driver for Node

    [MySQL driver for Node] 1.安装 2.一个示例 From this example, you can learn the following: Every method you ...

  4. Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)

    Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可.如果没有安装,可以采取自己编译的方式.在Qt的源码包的q ...

  5. 关于MySQL的驱动org.gjt.mm.mysql.Driver

    今天看了一个比较老视频使用org.gjt.mm.mysql.Driver来驱动连接,便试了一下看看怎么样,结果一直连不上数据库,后来看了tomcat的后台发现有报这个问题,于是把驱动改成com.mys ...

  6. [大数据技术]Kettle初次连接MySQL数据库 报错问题 错误连接数据库 Error occured while trying to connect to the database Exception while loading class org.gjt.mm.mysql.Driver

    报错内容如下: 错误连接数据库 [foodmartconn] : org.pentaho.di.core.exception.KettleDatabaseException: Error occure ...

  7. QT:MYSQL driver not loaded解决方法

    0.参考(按对本人帮助从高到低排列) Qt5.14.1 如何编译和使用mysql和mariadb数据库驱动 (15条消息) QMYSQL driver not loaded 的原理和解决办法_m158 ...

  8. jdbc mysql driver 6.0.2

    url = jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8&useLegac ...

  9. Django的MySQL Driver配置

    PEP 249规定了Python的数据库API.MySQL主要有三种API实现: MySQLdb 是Andy Dustman开发的.使用原生代码/C语言绑定的驱动,它已经开发了数十年. mysqlcl ...

  10. kettle 连接 mysql 出错 Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the ……

    解决办法:1: 首先,到官网下载mysql-connector-java. 2: 把驱动文件放置在data-integration\lib\ 目录下

随机推荐

  1. Codeforces.100633J.Ceizenpok's formula(扩展Lucas)

    题目链接 ->扩展Lucas //求C_n^k%m #include <cstdio> typedef long long LL; LL FP(LL x,LL k,LL p) { L ...

  2. wtforms源码流程

    未实例化前 1.继承的Form类 # Form(FormMeta("NewBase", (BaseForm,), {}))# Form(NewBase(BaseForm)) cla ...

  3. JVM的Client模式与Server模式

    概述 JVM有两种运行模式Server与Client.两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢:但是启动进入稳定期长期运行之后Server模式的程序运行速度比Clie ...

  4. System类与Runtime类

    PS: Java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能.java提供了System类与Runtime类来与程序的运行平台进行交互. System类: 1 ...

  5. java计算今天是今年的第几天

    Calendar.getInstance().get(Calendar.DAY_OF_YEAR)

  6. JDBC(5)—DatabaseMetaData

    1.简介: 使用元数据已实现通用的查询方法.元数据介绍:使用jdbc获得连接之后,得到一个Connection对象,可以通过这个对象获得DataBaseMetaData对象,该对象可以获得有关数据库管 ...

  7. .net core 3.0视图动态编译

    之前在使用Visual Studio 2019的时候,就发现asp.net 3.0中没有cshtml动态编译的功能了:也就是说,如果改了cshtml,刷新页面不会立即生效,而是要重新编译一次才行. 这 ...

  8. 如何实现一个Java Class 解析器

    原文出处: tinylcy 最近在写一个私人项目,名字叫做ClassAnalyzer,ClassAnalyzer的目的是能让我们对Java Class文件的设计与结构能够有一个深入的理解.主体框架与基 ...

  9. 290.单词模式。给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。(c++方法)

    题目描述: 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之 ...

  10. how to use boost program options

    From:  http://www.radmangames.com/programming/how-to-use-boost-program_options If it so happens that ...