本文介绍: 关于 SQLite 数据库与 Go 语言的 CRUD 操作


SQLite介绍安装


SQLite 简介

SQLite一个开放源代码数据库引擎具有独立,无服务器依赖,零配置支持事务等特点,SQLite 一直以轻量级为特点,在移动嵌入式设备使用广泛,官方称其是世界上部署最广泛的数据库引擎

SQLite一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎

SQLite 具有如下的特点与优势:


SQLite 的安装

Linux 命令行安装方式

sudo apt update
sudo apt-cache search sqlite
sudo apt install sqlite3 -y
SQLite version 3.27.2 2020-02-20 14:08:51
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> 

源码安装方式

curl https://www.sqlite.org/2022/sqlite-tools-linux-x86-3400100.zip

wget https://www.sqlite.org/2022/sqlite-autoconf-3400100.tar.gz
tar -zxvf https://www.sqlite.org/2022/sqlite-autoconf-3400100.tar.gz
mv sqlite-autoconf-3400100 sqlite
mv sqlite /usr/local/
./configure
make
  • 安装 SQLite ,输入如下命令:
make install
SQLite version 3.27.2 2020-02-20 14:08:51
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> 

图形化管理界面 DB Browser for SQLite 安装与使用

sudo apt-get install sqlitebrowser -y
sqlitebrowser  &

参考 如何在 Linux 上使用 DB Browser for SQLite|应用程序|sql|sqlite_网易订阅


SQLite 基础入门


SQLite 基本命令说明

  • 系统命令 以 “.开头

  • 普通命令 ,以 “;结束

  • 命令都是在 sqlite> 后输入。

命令 含义
.schema 查看表的结构
.quit 退出数据库
.exit 退出数据库
.help 查看帮助信息
.databases 查看数据库
.tables 显示数据库中所有的表的表名
.open 创建数据库

数据库管理命令

sqlite3 test.db -- 创建数据库
.open test.db -- 创建数据库
.databases -- 查看数据库
.quit -- 退出

sqlite3 testDB.db .dump > testDB.sql -- 导出数据库txt文件
sqlite3 testDB.db < testDB.sql -- txt文件导入数据库

ATTACH DATABASE 'test.db' as 'TEST'; -- 附加数据库
DETACH DATABASE 'TEST'; -- 分离数据

数据表操作

CREATE TABLE database_name.table_name(
   		column1 datatype  PRIMARY KEY(one or more columns),
   		column2 datatype,
  		column3 datatype,
   		.....
   		columnN datatype,
);
  • 查看数据表
 .tables
.schema COMPANY
DROP TABLE database_name.table_name;
DROP TABLE COMPANY;

数据表操作示例

CREATE TABLE COMPANY(
   		ID INT PRIMARY KEY     NOT NULL,
   		NAME           TEXT    NOT NULL,
   		AGE            INT     NOT NULL,
   		ADDRESS        CHAR(50),
   		SALARY         REAL
);

数据库语句

INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]  
VALUES (value1, value2, value3,...valueN);

INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
SELECT column1, column2, columnN FROM table_name;
.header on
.mode column
UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];
DELETE FROM table_name WHERE [condition];

数据库语句示例

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );

INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );

SELECT * FROM COMPANY;
SELECT ID, NAME, SALARY FROM COMPANY;

UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;
UPDATE COMPANY SET ADDRESS = 'Texas', SALARY = 20000.00;

DELETE FROM COMPANY WHERE ID = 7;
DELETE FROM COMPANY;

Go 访问 SQLite


获取访问接口

  • 安装驱动,输入如下命令:
go get -u github.com/mattn/go-sqlite3
import (
		_ "github.com/mattn/go-sqlite3"
)

Go 操作 SQLite

启动 SQLite创建数据库和数据表 user,输入如下命令:

CREATE TABLE `user` (
	`uid` INT PRIMARY KEY NOT NULL,
	`name` TEXT NOT NULL,
	`phone` CHAR(50)
);

INSERT INTO `user` (`uid`, `name`, `phone`) VALUES (15, 'yx', '138888888');
INSERT INTO `user` (`uid`, `name`, `phone`) VALUES (111, 'yx', '138888888');

编写 Go 程序连接数据库,该程序的具体代码如下:

package main

import (
		"database/sql"
		_ "github.com/mattn/go-sqlite3"
		"log"
)

func main() {
		db, err := sql.Open("sqlite3", "/home/Tao/test.db")
		if err != nil {
				log.Fatal(err)
		}
		defer db.Close()
}
  • 导出数据库数据,输入如下命令:
sqlite3 test.db > test.sql
package main

import (
		"database/sql"
		"fmt"
		_ "github.com/mattn/go-sqlite3"
)

var db *sql.DB

// 定义一个初始化数据库的函数
func initDB() (err error) {
		//连接数据库
		db, err = sql.Open("sqlite3", "/home/Tao/test.db")
		if err != nil {
				return err
		}
		// 尝试与数据库建立连接校验dsn是否正确
		err = db.Ping()
		if err != nil {
				return err
		}
		return nil
}

func main() {
		if err := initDB(); err != nil {
				fmt.Printf("Initing the db is failed, err: %vn", err)
		} else {
				fmt.Plintln("Connecting the db is ok!")
		}
}

设置最大连接数:n<=0,无限制默认为 0(不会超过数据库默认配置)。

func (db *DB) SetMaxOpenConns(n int)

设置最大闲置连接数:n<=0,无限制,默认为 0(不会超过数据库默认配置)。

func (db *DB) SetMaxOpenConns(n int)

示例

示例的数据库表结构如下所示,相应的建表 SQL :

CREATE TABLE `userinfo` (
    	`uid` INTEGER PRIMARY KEY AUTOINCREMENT,
    	`username` VARCHAR(64) NULL,
    	`departname` VARCHAR(64) NULL,
    	`created` DATE NULL
);
CREATE TABLE `userdetail` (
    	`uid` INT(10) NULL,
    	`intro` TEXT NULL,
    	`profile` TEXT NULL,
    	PRIMARY KEY (`uid`)
);

编写一个 Go 程序实现该数据库表中数据的增删改查操作,该程序的具体代码如下:

package main

import (
    	"database/sql"
    	"fmt"
    	"time"
    	_ "github.com/mattn/go-sqlite3"
)
func main() {
    	db, err := sql.Open("sqlite3", "./foo.db")
    	checkErr(err)
    	// 插入数据
    	stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created) values(?,?,?)")
    	checkErr(err)
    	res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
    	checkErr(err)
    	id, err := res.LastInsertId()
    	checkErr(err)
    	fmt.Println(id)
    	// 更新数据
    	stmt, err = db.Prepare("update userinfo set username=? where uid=?")
    	checkErr(err)
    	res, err = stmt.Exec("astaxieupdate", id)
    	checkErr(err)
    	affect, err := res.RowsAffected()
    	checkErr(err)
    	fmt.Println(affect)
    	// 查询数据
    	rows, err := db.Query("SELECT * FROM userinfo")
    	checkErr(err)
    	for rows.Next() {
        		var uid int
        		var username string
        		var department string
        		var created time.Time
        		err = rows.Scan(&amp;uid, &amp;username, &amp;department, &amp;created)
        		checkErr(err)
        		fmt.Println(uid)
        		fmt.Println(username)
        		fmt.Println(department)
        		fmt.Println(created)
    	}
    	// 删除数据
    	stmt, err = db.Prepare("delete from userinfo where uid=?")
    	checkErr(err)
    	res, err = stmt.Exec(id)
    	checkErr(err)
    	affect, err = res.RowsAffected()
    	checkErr(err)
    	fmt.Println(affect)
    	db.Close()
}

func checkErr(err error) {
    	if err != nil {
        		panic(err)
    	}
}

可以看到上面的程序·代码和 MySQL 操作的代码几乎是一模一样的,唯一改变的就是导入驱动改变了,然后调用sql.Open() 方法采用了 SQLite 的方式打开


SQL查询

func (db *DB) QueryRow(query string, args ...interface{}) *Row
package main

import (
		"database/sql"
		"fmt"
		_ "github.com/mattn/go-sqlite3"
)

var db *sql.DB

// 定义一个初始化数据库的函数
func initDB() (err error) {
		//连接数据库
		db, err = sql.Open("sqlite3", "/home/Tao/test.db")
		if err != nil {
				return err
		}
		// 尝试与数据库建立连接校验dsn是否正确
		err = db.Ping()
		if err != nil {
				return err
		}
		return nil
}

type User struct {
		Uid	 	int
		Name 	string
		Phone	string
}

func queryRow() {
		var u User;
		if err := db.QueryRow("select uid, name, phone from user where uid=?;", 111).Scan(&amp;u.Uid, &amp;u.Name, &amp;u.Phone); err != nil {
				fmt.Printf("scan failed, err:%vn", err)
				return
		}
		fmt.Printf("uid:%d name:%s phone:%sn", u.Uid, u.Name, u.Phone)
}

func main() {
		if err := initDB(); err != nil {
				fmt.Printf("init db failed, err: %vn", err)
		}
		queryRow()
}
func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
package main

import (
		"database/sql"
		"fmt"
		_ "github.com/mattn/go-sqlite3"
)

var db *sql.DB

// 定义一个初始化数据库的函数
func initDB() (err error) {
		//连接数据库
		db, err = sql.Open("sqlite3", "/home/Tao/test.db")
		if err != nil {
				return err
		}
		// 尝试与数据库建立连接(校验dsn是否正确
		err = db.Ping()
		if err != nil {
				return err
		}
		return nil
}

type User struct {
		Uid	 	int
		Name 	string
		Phone 	string
}

func queryMultiRow() {
		var u User;
		rows, err := db.Query("select uid, name, phone from user where uid>?;", 0)
		if err != nil {
				fmt.Printf("query failed, err:%vn", err)
				return
		}
		defer rows.Close()

		for rows.Next() {
				err := rows.Scan(&u.Uid, &u.Name, &u.Phone)
				if err != nil {
					fmt.Printf("scan failed, err:%vn", err)
					return
				}
				fmt.Printf("uid:%d name:%s phone:%sn", u.Uid, u.Name, u.Phone)
		}
}

func main() {
		if err := initDB(); err != nil {
				fmt.Printf("init db failed, err: %vn", err)
		}
		queryMultiRow()
}
func (db *DB) Exec(query string, args ...interface{}) (Result, error)
func (db *DB) Exec(query string, args ...interface{}) (Result, error)
package main

import (
		"database/sql"
		"fmt"
		_ "github.com/mattn/go-sqlite3"
)

var db *sql.DB

// 定义一个初始化数据库的函数
func initDB() (err error) {
		//连接数据库
		db, err = sql.Open("sqlite3", "/home/Tao/test.db")
		if err != nil {
				return err
		}
		// 尝试与数据库建立连接(校验dsn是否正确
		err = db.Ping()
		if err != nil {
				return err
		}
		return nil
}

//插入数据
func insertRow() {
		ret, err := db.Exec("insert into user(uid, name, phone) values(?, ?, ?);", 12, "ml", "15906693677")
		if err != nil {
				fmt.Printf("insert failed, err:%vn", err)
				return
	}
	
		uid, err := ret.LastInsertId()
		if err != nil {
				fmt.Printf("get lastinsert ID failed, err:%vn", err)
				return
		}
		fmt.Printf("insert success, the id is %d.n", uid)
	
}

//更新数据
func updateRow() {
		ret, err := db.Exec("update user set name=? where uid=?;", "tt", 12)
		if err != nil {
				fmt.Printf("update failed, err:%vn", err)
				return
		}
	
		n, err := ret.RowsAffected()
		if err != nil {
				fmt.Printf("get lastinsert ID failed, err:%vn", err)
				return
		}
		fmt.Printf("update success, affected rows:%dn", n)
}

//删除数据
func deleteRow() {
		ret, err := db.Exec("delete from user where uid=?;", 12)
		if err != nil {
				fmt.Printf("delete failed, err:%vn", err)
				return
		}
	
		n, err := ret.RowsAffected()
		if err != nil {
				fmt.Printf("get lastinsert ID failed, err:%vn", err)
			return
		}
		fmt.Printf("delete success, affected rows:%dn", n)
}

func main() {
		if err := initDB(); err != nil {
				fmt.Printf("init db failed, err: %vn", err)
		}
		insertRow()
		updateRow()
		deleteRow()
}

原文地址:https://blog.csdn.net/qq_46457076/article/details/128819632

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_35712.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注