开发学院

您的位置:首页>教程>正文

教程正文

Golang操作SQLite的例子

Go 语言访问sqlite

  本章中,我们将学习如何使用Golang访问SQLite数据库,Golang默认提供了database/sql包用于简化对SQL数据库的访问,。

  database/sql可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,会导致过多连接使系统资源耗尽。

引入sqlite包

  这里如果按照网上写的方式,导入 "https://github.com/mattn/go-sqlite3",因为网络原因会报错,所以笔者采用了简单的方式,直接从https://github.com/mattn/go-sqlite3下载zip包,解压后放到go语言安装目录的src目录下,起名为sqlite,笔者的go安装目录为c:\go,zip包下面的一堆文件就放到C:\Go\src\sqlite目录下:

  然后代码中直接导入即可,代码如下:

import (
    "database/sql"
    "fmt"
    _ "sqlite"
)

  sqlite的驱动还需要gcc支持,linux系统自带gcc,如果您是windows,则需要单独安装gcc并添加到PATH变量中。软件下载地址:https://sourceforge.net/projects/mingw-w64/,下载安装包后执行,根据需要选择i686(32位)或者x86_64(64位)平台。如图:

  

001_setup.png

  安装后把安装路径下面的bin目录添加进PATH中,如图:

002_path.png

连接SQLite

  导入sqlite驱动包之后就可以进行连接,如果没有问题,就可以返回db对象,后面就可以使用这个db对象。

  db, err := sql.Open("sqlite3", "./my")

新增/更新数据

  拿到db对象后,就可以尝试使用它进行数据的插入和更新了。

  stmt, err := db.Prepare("Insert into ser_sign(name,phone,created_at) values(?,?,?)")
  res, err := stmt.Exec("serfan", "13800000001", "2018-03-06")

  执行上述代码,ser_sign表中就会增加一条新数据。

查询数据

  上面例子已经插入了至少一条数据,这个时候我们可以进行查询的演示了。、

rows, err := db.Query("SELECT id,name FROM ser_sign")
for rows.Next() {
var id  int
var name string
err = rows.Scan(&id, &name)
        fmt.Println(id,name);
}

  使用完rows对象,一定要记得释放资源:

  rows.Close()

删除记录

  删除记录跟新增调用的方法一样,只是sql语句有区别。

  stmt, err := db.Prepare("delete from ser_sign where id=?")
   res, err := stmt.Exec(1)

  执行完毕就完成数据的删除

事务处理

  下面是执行事务的演示代码:

tx, err:= db.Begin();
    ret4, err:= tx.Exec("update ser_sign set name = 'hahaha' where id = ?", 1);
    ret5, err:= tx.Exec("update ser_sign set name = 'hehehe' where id = ?", 2);
    finish1, err:= ret4.RowsAffected();
    finish2, err:= ret5.RowsAffected();
    if finish1 > 0 && finish2 > 0 {
        tx.Commit();
    } else {
        tx.Rollback();
    }

  最后是完整的测试代码,在笔者的环境中可以测试通过。

package main
import (
    "database/sql"
    "fmt"
    _ "sqlite"
)
func main(){
    db, err := sql.Open("sqlite3", "./my")
    checkErr(err)
//新增
    stmt, err := db.Prepare("Insert into ser_sign(name,phone,created_at) values(?,?,?)")
    checkErr(err)
    res, err := stmt.Exec("serfan", "13800000001", "2018-03-06")
    checkErr(err)
    id, err := res.LastInsertId()
    checkErr(err)
    fmt.Println(id)

//查询
rows, err := db.Query("SELECT id,name FROM ser_sign")
for rows.Next() {
var id  int
var name string
err = rows.Scan(&id, &name)
        fmt.Println(id,name);
}
//删除
stmt, err = db.Prepare("delete from ser_sign where id=?")
res, err = stmt.Exec(8)
//事务
tx, err:= db.Begin();
    ret4, err:= tx.Exec("update ser_sign set name = 'hahaha' where id = ?", 1);
    ret5, err:= tx.Exec("update ser_sign set name = 'hehehe' where id = ?", 2);
    finish1, err:= ret4.RowsAffected();
    finish2, err:= ret5.RowsAffected();
    if finish1 > 0 && finish2 > 0 {
        tx.Commit();
    } else {
        tx.Rollback();
    }
    fmt.Println("it is ok!")
}
func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}