database/sql
Golang提供了标准库database/sql
用于和数据库交互,database/sql
只是一套统一地抽象接口,真正与数据库打交道的是各个数据库对应的驱动实现,因此使用前需要先注册对应数据库的驱动,然后就可以使用SQL中定义的接口来统一地操作数据库了。
go-sqlite3
-
go-sqlite3
库是Golang实现SQLite数据库的驱动 -
go-sqlite3
依赖于golang.org/x/net/context
$ go get github.com/mattn/go-sqlite3
exec: "gcc": executable file not found in %PATH%
由于SQLite3使用C语言开发,因此go-sqlite3
需要GCC工具来编译C代码。
MinGW
MinGW全称Minimalist GNU on Windows,它实际上是将经典的开源C语言编译器GCC移植到Windows平台,包含Win32API,因此可将源代码编译为可在Windows中运行的可执行程序。简单来说,MinGW就是GCC的Windows版本。
进入 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/,下载 mingw-w64-install.exe
安装。

将下载的mingw64
文件夹下的bin
目录添加到系统环境变量Path
中。
$ gcc -v
gcc version 9.2.0 (tdm64-1)
TDM-GCC
TDM-GCC 衍生自 MinGW 和 MinGW-w64 的项目,TDM-GCC是 http://tdragon.net 搞的用于MinGW和mingw-w64的gcc分支,使用广泛。
下载安装后,将bin
目录添加到系统环境变量Path
中。
$ gcc -v
gcc version 9.2.0 (tdm64-1)
示例
$ vim ./test/test_sql.go
package test
import (
"database/sql"
"fmt"
"testing"
_ "github.com/mattn/go-sqlite3"
)
func TestSql(t *testing.T) {
db, err := sql.Open("sqlite3", "test.db")
if err != nil {
panic(err)
}
defer func() {
db.Close()
}()
var query string
query = "DROP TABLE IF EXISTS users;"
_, err = db.Exec(query)
if err != nil {
panic(err)
}
query = "CREATE TABLE users(id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL);"
_, err = db.Exec(query)
if err != nil {
panic(err)
}
query = "INSERT INTO users(`id`,`name`) VALUES(1, ?), (2, ?);"
result, err := db.Exec(query, "admin", "root")
if err != nil {
panic(err)
}
affected, err := result.RowsAffected()
if err != nil {
panic(err)
}
fmt.Printf("affected rows is %d\n", affected)
var name string
query = "SELECT name FROM users WHERE 1=1 LIMIT 0,1;"
row := db.QueryRow(query)
err = row.Scan(&name)
if err != nil {
panic(err)
}
fmt.Printf("name = %v\n", name)
}
执行
$ go test -v --run=TestSql sql_test.go
=== RUN TestSql
affected rows is 2
name = admin
--- PASS: TestSql (0.02s)
PASS
ok command-line-arguments 0.996s