Go-MySQL-Driver
1、下载Go-Mysql-Driver
- go get github.com/go-sql-driver/mysql
2、引入import
- import(
- "database/sql"
- _"github.com/Go-SQL-Driver/MySQL"
- "log"
- "strconv"
- //"reflect" //获取变量类型用
- )
3、增:
- func main (){
- //insert
- name := "name"
- pwd := "password"
- nickname := "nickname"
- db,err := sql.Open("mysql","go_mysql_user:go_mysql_pwd@tcp(localhost:3306)/go_mysql?charset=utf8")
- if err != nil{
- panic(err.Error())
- log.Println(err)
- return
- }
- defer db.Close() //只有在前面用了 panic[抛出异常] 这时defer才能起作用,如果链接数据的时候出问题,他会往err写数据。defer:延迟,这里立刻申请了一个关闭sql 链接的操作,defer 后的方法,或延迟执行。在函数抛出异常一会被执行
- insert_sql := "insert into users (name,pwd,nickname) value (?,?,?),(?,?,?),(?,?,?),(?,?,?)"
- stmt,err := db.Prepare(insert_sql) //准备一个sql操作,返回一个*Stmt,用户后面的执行,这个Stmt可以被多次执行,或者并发执行
- /*
- * 这个stmt的主要方法:Exec、Query、QueryRow、Close
- */
- if err != nil {
- log.Println(err)
- return
- }
- res,err := stmt.Exec(name,pwd,nickname,name,pwd,nickname,name,pwd,nickname,name,pwd,nickname)
- if err != nil {
- log.Println(err)
- return
- }
- lastInsertId,err := res.LastInsertId() //批量插入的时候LastInserId返回的是第一条id,单条插入则返回这条的id
- //lastInsertId,err := res.RowsAffected() //插入的是后RowsAffected 返回的是插入的条数
- if err != nil {
- log.Println(err)
- return
- }
- //log.Println(reflect.TypeOf(lastInsertId)) //打印变量类型
- last_insert_id_string := strconv.FormatInt(lastInsertId,) //int64 转string 需要引入 strconv包
- log.Println("lastInsertId = " + last_insert_id_string)
- }
4、删
- func main (){
- //delete
- del_sql := "delete from users where id=?"
- del_stmt,del_err := db.Prepare(del_sql)
- del_stmt.Exec()//不返回任何结果
- }
5、改
- func main (){
- //update
- update_sql := "update users set name=? where id=?"
- update_stmt,update_err := db.Prepare(update_sql)
- if update_err != nil {
- log.Println(update_err)
- return;
- }
- update_res,update_err := update_stmt.Exec("username",)
- if update_err != nil {
- log.Printf("%v",update_err)
- return
- }
- affect_count,_ := update_res.RowsAffected() //返回影响的条数,注意有两个返回值
- log.Printf("%v",affect_count)
- }
6、查一条
- type User struct{
- id int
- name string
- pwd string
- nickname string
- }
- func main (){
- //select
- var user User
- select_sql := "select * from users where id > ?"
- select_err := db.QueryRow(select_sql,).Scan(&user.id,&user.name,&user.pwd,&user.nickname)//查询一条,返回一条结果。并赋值到user这个结构体类型的变量中,就算查询到的是多条,单返回的还是一条
- if select_err != nil {//如果没有查询到任何数据就进入if中err:no rows in result set
- log.Println(select_err)
- return
- }
- log.Println(user)
- }
7、查多条
- func main (){
- //查询多条
- select_rows,select_err := db.Query(select_sql,)
- if select_err != nil {
- log.Println(select_err)
- return
- }
- defer select_rows.Close()
- for select_rows.Next(){
- var id int
- var name string
- var pwd string
- var nickname string
- if err := select_rows.Scan(&id,&name,&pwd,&nickname); err != nil {
- log.Println(err)
- return
- }
- log.Printf("id=%v,name=%v,pwd=%v,nickname=%v",id,name,pwd,nickname)
- }
- }
8、事务
- func main (){
- //事务
- tx,err := db.Begin() //声明一个事务的开始
- if err != nil {
- log.Println(err)
- return
- }
- insert_sql := "insert into users (name,pwd,nickname) value(?,?,?)"
- insert_stmt,insert_err := tx.Prepare(insert_sql)
- if insert_err != nil {
- log.Println(insert_err)
- return
- }
- insert_res,insert_err := insert_stmt.Exec("tx_name","tx_pwd","tx_nickname")
- last_insert_id,_ := insert_res.LastInsertId()
- log.Println(last_insert_id)
- defer tx.Rollback() //回滚之前上面的last_login_id是有的,但在回滚后该操作没有被提交,被回滚了,所以上面打印的Last_login_id的这条数据是不存在于数据库表中的
- //tx.Commit() //这里提交了上面的操作,所以上面的执行的sql 会在数据库中产生一条数据
- }
9、总结
- db,err := sql.Open("mysql","数据库登录名:数据库密码@tcp(服务器:端口)/数据库名?charset=utf8") 对应修改;
- defer db.Close() defer 是延迟或异常或者该方法结束时执行的操作。这里表示有异常就关闭db 可与 panic(err.Error())=》抛出异常。配合使用。一种情况不可执行=》你的方法进入了死循环,该方法不会结束与异常则不可执行。
- LastInsertId() 获取插入第一条的id 有用
- RowsAffected() 获取影响/插入的条数 有用
- reflect.TypeOf(i) reflect包中TypeOf 返回的是变量i的类型
- strconv.FormatInt(int64位变量,) strconv包中FormatInt将int64位的变量转为string
10、附github地址
- https://github.com/go-sql-driver/mysql
Go-MySQL-Driver的更多相关文章
- Qt5.7中使用MySQL Driver
Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可. 如果没有安装,可以采取自己编译的方式. 在Qt的源码包 ...
- 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 ...
- MySQL driver for Node
[MySQL driver for Node] 1.安装 2.一个示例 From this example, you can learn the following: Every method you ...
- Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)
Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可.如果没有安装,可以采取自己编译的方式.在Qt的源码包的q ...
- 关于MySQL的驱动org.gjt.mm.mysql.Driver
今天看了一个比较老视频使用org.gjt.mm.mysql.Driver来驱动连接,便试了一下看看怎么样,结果一直连不上数据库,后来看了tomcat的后台发现有报这个问题,于是把驱动改成com.mys ...
- [大数据技术]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 ...
- QT:MYSQL driver not loaded解决方法
0.参考(按对本人帮助从高到低排列) Qt5.14.1 如何编译和使用mysql和mariadb数据库驱动 (15条消息) QMYSQL driver not loaded 的原理和解决办法_m158 ...
- jdbc mysql driver 6.0.2
url = jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8&useLegac ...
- Django的MySQL Driver配置
PEP 249规定了Python的数据库API.MySQL主要有三种API实现: MySQLdb 是Andy Dustman开发的.使用原生代码/C语言绑定的驱动,它已经开发了数十年. mysqlcl ...
- kettle 连接 mysql 出错 Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the ……
解决办法:1: 首先,到官网下载mysql-connector-java. 2: 把驱动文件放置在data-integration\lib\ 目录下
随机推荐
- 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 ...
- wtforms源码流程
未实例化前 1.继承的Form类 # Form(FormMeta("NewBase", (BaseForm,), {}))# Form(NewBase(BaseForm)) cla ...
- JVM的Client模式与Server模式
概述 JVM有两种运行模式Server与Client.两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢:但是启动进入稳定期长期运行之后Server模式的程序运行速度比Clie ...
- System类与Runtime类
PS: Java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能.java提供了System类与Runtime类来与程序的运行平台进行交互. System类: 1 ...
- java计算今天是今年的第几天
Calendar.getInstance().get(Calendar.DAY_OF_YEAR)
- JDBC(5)—DatabaseMetaData
1.简介: 使用元数据已实现通用的查询方法.元数据介绍:使用jdbc获得连接之后,得到一个Connection对象,可以通过这个对象获得DataBaseMetaData对象,该对象可以获得有关数据库管 ...
- .net core 3.0视图动态编译
之前在使用Visual Studio 2019的时候,就发现asp.net 3.0中没有cshtml动态编译的功能了:也就是说,如果改了cshtml,刷新页面不会立即生效,而是要重新编译一次才行. 这 ...
- 如何实现一个Java Class 解析器
原文出处: tinylcy 最近在写一个私人项目,名字叫做ClassAnalyzer,ClassAnalyzer的目的是能让我们对Java Class文件的设计与结构能够有一个深入的理解.主体框架与基 ...
- 290.单词模式。给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。(c++方法)
题目描述: 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之 ...
- how to use boost program options
From: http://www.radmangames.com/programming/how-to-use-boost-program_options If it so happens that ...