前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQLite3 极简教程 & Go 使用 SQLite 内存模式操作数据结构

SQLite3 极简教程 & Go 使用 SQLite 内存模式操作数据结构

作者头像
一个会写诗的程序员
发布2022-05-13 15:12:28
发布2022-05-13 15:12:28
3.8K0
举报
文章被收录于专栏:磁盘文件中的一个完整的数据库

4.数据库文件可以在不同字节顺序的机器间自由的共享

5.支持数据库大小至2TB

6. 足够小, 大致13万行C代码, 4.43M

7. 比一些流行的数据库在大部分普通数据库操作要快

8. 简单, 轻松的API

9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定

10. 良好注释的源代码, 并且有着90%以上的测试覆盖率

11. 独立: 没有额外依赖

12. 源码完全的开源, 你可以用于任何用途, 包括出售它

13. 支持多种开发语言,C, C++, PHP, Perl, Java, C#,Python,Ruby等

SQLite 命令

与关系数据库进行交互的标准 SQLite 命令类似于 SQL。命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。这些命令基于它们的操作性质可分为以下几种:

DDL - 数据定义语言

命令

描述

CREATE

创建一个新的表,一个表的视图,或者数据库中的其他对象。

ALTER

修改数据库中的某个已有的数据库对象,比如一个表。

DROP

删除整个表,或者表的视图,或者数据库中的其他对象。

DML - 数据操作语言

命令

描述

INSERT

创建一条记录。

UPDATE

修改记录。

DELETE

删除记录。

DQL - 数据查询语言

命令

描述

SELECT

从一个或多个表中检索某些记录。

SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL包括:

代码语言:javascript
复制
ATTACH DATABASE

BEGIN TRANSACTION

comment

COMMIT TRANSACTION

COPY

CREATE INDEX

CREATE TABLE

CREATE TRIGGER

CREATE VIEW

DELETE

DETACH DATABASE

DROP INDEX

DROP TABLE

DROP TRIGGER

DROP VIEW

END TRANSACTION

EXPLAIN

expression

INSERT

ON CONFLICT clause

PRAGMA

REPLACE

ROLLBACK TRANSACTION

SELECT

UPDATE

SQLite 数据类型

SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么(只有在一种情况下不是, 稍后解释). 对于SQLite来说对字段不指定类型是完全有效的. 如:

代码语言:javascript
复制
Create Table ex1(a, b, c);

诚然SQLite允许忽略数据类型, 但是仍然建议在你的Create Table语句中指定数据类型. 因为数据类型对于你和其他的程序员交流, 或者你准备换掉你的数据库引擎时能起到一个提示或帮助的作用.

SQLite支持常见的数据类型, 如:

代码语言:javascript
复制
CREATE TABLE ex2
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5)
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)

前面提到在某种情况下, SQLite的字段并不是无类型的. 即在字段类型为”Integer Primary Key”时.

Go 操作 SQLite 实例

导入依赖 go-sqlite3

代码语言:javascript
复制
import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-sqlite3"
    ...
)

创建数据库

代码语言:javascript
复制
database, err := sql.Open("sqlite3", "./alpha.db")

创建表

代码语言:javascript
复制
stmt, _ := database.Prepare("create table if not exists user(id integer primary key, firstname text, lastname text)")
stmt.Exec()

插入数据

代码语言:javascript
复制
stmt, _ = database.Prepare("insert into user( firstname, lastname) values(?,?)")
stmt.Exec("Jack", "Chen")

查询数据

代码语言:javascript
复制
var id int
var firstname string
var lastname string
rows, err := database.Query("select id, firstname, lastname from user")
if nil != err {
    fmt.Println(err)
}
for rows.Next() {
    rows.Scan(&id, &firstname, &lastname)
    fmt.Println(strconv.Itoa(id) + ": " + firstname + " " + lastname)
}

完整代码如下

源码:

代码语言:javascript
复制
package sqlite

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

func SQLiteDemo() {
    var start = time.Now().UnixMicro()
    database, err := sql.Open("sqlite3", fmt.Sprintf("./alpha%d.db", start))
    if nil != err {
        fmt.Println(err)
    }
    stmt, _ := database.Prepare("create table if not exists user(id integer primary key, firstname text, lastname text)")
    stmt.Exec()

    stmt, _ = database.Prepare("insert into user( firstname, lastname) values(?,?)")
    stmt.Exec("Jack", "Chen")

    var id int
    var firstname string
    var lastname string
    rows, err := database.Query("select id, firstname, lastname from user")
    if nil != err {
        fmt.Println(err)
    }
    for rows.Next() {
        rows.Scan(&id, &firstname, &lastname)
        fmt.Println(strconv.Itoa(id) + ": " + firstname + " " + lastname)
    }

    var end = time.Now().UnixMicro()
    fmt.Printf("SQLiteDemo: %d\n", end-start)

}


// main
package main

import (
    "go_basics/sqlite"
)

func main() {
    sqlite.SQLiteDemo()
}

磁盘文件模式, 一个简单的"建表-插入-查询"操作需要耗时 5467 μs.

代码语言:javascript
复制
1: Jack Chen
SQLiteDemo: 5467

可以看到,每个 SQLite DB 都有一个 root 表 : sqlite_master

代码语言:javascript
复制
select * from sqlite_master;

--output
type,name,tbl_name,rootpage,sql
table,user,user,2,"CREATE TABLE user(id integer primary key, firstname text, lastname text)"

SQLite 内存模式使用

SQLite In-Memory 模式

SQLite 数据库通常存储在单个普通磁盘文件中。我们也可以使用内存模式。SQLite 数据库单纯的存在于内存中的最常用方法是使用特殊文件名 :memory: 打开数据库。换句话说,不是将真实磁盘文件的名称传递给 sqlite3_open() 函数,而是传入字符串:memory: 。 例如:

代码语言:javascript
复制
rc = sqlite3_open(":memory:",&db);

使用说明:

  1. 调用此接口完成后,不会打开任何磁盘文件。而是在内存中创建一个新的数据库。
  2. 数据库连接关闭后,数据库就不再存在。
  3. 每一个memory数据库彼此不同。因此,打开两个数据库连接,每个数据库连接的文件名为“:memory:”,将创建两个独立的内存数据库。

使用内存 SQLite

使用内存 SQLite 姿势: sql.Open("sqlite3", ":memory:") , 代码如下:

代码语言:javascript
复制
database, err := sql.Open("sqlite3", ":memory:")

完整源代码:

代码语言:javascript
复制
func SQLiteInMemoryDemo() {
    var start = time.Now().UnixMicro()

    database, err := sql.Open("sqlite3", ":memory:")
    if nil != err {
        fmt.Println(err)
    }
    stmt, _ := database.Prepare("create table if not exists user(id integer primary key, firstname text, lastname text)")
    stmt.Exec()

    stmt, _ = database.Prepare("insert into user( firstname, lastname) values(?,?)")
    stmt.Exec("Jack", "Chen")

    var id int
    var firstname string
    var lastname string
    rows, err := database.Query("select id, firstname, lastname from user")
    if nil != err {
        fmt.Println(err)
    }
    for rows.Next() {
        rows.Scan(&id, &firstname, &lastname)
        fmt.Println(strconv.Itoa(id) + ": " + firstname + " " + lastname)
    }

    var end = time.Now().UnixMicro()
    fmt.Printf("SQLiteInMemoryDemo: %d", end-start)

}

// main
package main

import (
    "fmt"
    "go_basics/sqlite"
)

func main() {
    sqlite.SQLiteDemo()
    sqlite.SQLiteInMemoryDemo()
}

性能耗时: 434 μs (是磁盘模式的 10 倍+)

代码语言:javascript
复制
1: Jack Chen
SQLiteInMemoryDemo: 434

SQLite 体系结构 & 架构组成

SQLite拥有一个精致的、模块化的体系结构,并引进了一些独特的方法进行关系型数据库的管理。它由被组织在3个子系统中的8个独立的模块组成,如图1-2所示。这个模型将查询过程划分为几个不连续的任务,就像在流水线上工作一样。在体系结构栈的顶部编译查询语句,在中部执行它,在底部处理操作系统的存储和接口。

SQLite 存储引擎

SQLite 计算引擎

参考资料

https://www.youtube.com/watch?v=gpxnbly9bz4 https://blog.csdn.net/cunjie3951/article/details/106917999

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SQLite 简介
    • 功能特性
    • SQLite 命令
      • DDL - 数据定义语言
        • DML - 数据操作语言
          • DQL - 数据查询语言
          • SQLite 数据类型
          • Go 操作 SQLite 实例
            • 导入依赖 go-sqlite3
              • 创建数据库
                • 创建表
                  • 插入数据
                    • 查询数据
                      • 完整代码如下
                      • SQLite 内存模式使用
                        • SQLite In-Memory 模式
                          • 使用内存 SQLite
                          • SQLite 体系结构 & 架构组成
                          • SQLite 存储引擎
                          • SQLite 计算引擎
                          • 参考资料
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档

                          相关内容推荐

                          汽车内饰关键词大全怎么提高电影关键词排名淘宝关键词提高热度怎么制作关键词查询链接下周股市关键词是什么智能计划关键词优化方法2021思维导图关键词拼多多批量设置关键词90后战士的关键词地球脉动关键词是什么仪容仪表关键词是什么济宁提高关键词排名方法美学思维的关键词是关键词排名广告有哪些如何匹配搜索关键词排名中考政治关键词答题大全推衣服怎么写关键词外文期刊有关键词吗公众号如何关键词优化汽车饰品关键词大全临潼关键词优化推广简单的关键词唤醒算法荔湾seo优化关键词费用关键词搜索不到直播号搜索如何修改关键词排名保定关键词优化找哪家同时查找多个文档关键词360关键词排名推广优化什么网站可以检索关键词日本GV搜什么关键词关键词优化营销团队口号外贸怎样写关键词寂寞圣哲老子篇关键词南阳关键词优化服务足球关键词a到z陕西关键词扩展工具天津关键词优化公司排名汕头关键词排名企业形容T恤的关键词关键词规划师黑马沧州产品关键词网站优化漯河关键词优化公司电话情人节关键词2022论文可以不加关键词吗行业研究关键词有哪些淘宝关键词重复删除了亚马逊关键词手动推排名国际站关键词指数查询黄山关键词优化如何选择三里人家关键词前奏关键词吉他谱研修所获关键词有哪些搜不到的关键词排名自行车关键词标题网络违法违规关键词查询关键词挖掘商机怎么写直通车关键词 标题屠呦呦的礼物关键词外贸平台关键词为何收费论文关键词理论研究如何避开关键词检索提升本领是关键词吗汽车网站的关键词初三数学关键词总结小米企业的关键词优化亚马逊关键词间相互带动淘宝关键词哪里查看详情正规seo优化关键词收录怎样制作关键词图表视频什么是新闻的关键词关键词伴奏歌谱下载关键词提取的评价指标北京关键词小程序开发共同富裕摘要关键词晨练的关键词有哪些亚马逊如何修改否定关键词知网2.0关键词检索颐和园里面的关键词孝感关键词推广哪家好些冬天男裤子关键词图片关键词属于文献特征的食品推广关键词有哪些宜昌专业关键词排名外包女装关键词搜索技巧论文论文关键词要倾斜吗人群关键词都有哪些英语优化关键词电话号码深圳企业关键词优化公司黄山关键词推广如何选比较常见的关键词有热门关键词优化在线排名黄山关键词推广如何选重庆关键词优化网站推广网易云怎么买关键词风格素材关键词有哪些泉山seo优化关键词淘宝商品怎么创建关键词珠海优化关键词点击量领取美大选关键词头条标题关键词有哪些拼多多怎样显示关键词游戏的工具价值关键词英语作文标题的关键词新乡关键词优化售价关键词的选择应注意苏州优化关键词排名推广科普领域关键词是什么成长我的2021关键词保洁关键词排名查询网站公众号刷关键词软件测测cp的关键词2018年关键词回顾宁波关键词优化免费咨询好的关键词排名电话沟通礼貌关键词有哪些命名空间引用关键词是唐山关键词优化选哪家河神电视剧关键词咸鱼关键词排名怎么查淘宝关键词搜索最新调整亚马逊看别人的关键词店铺关键词写什么好宁波关键词优化怎样收费什么叫品牌的关键词如何查询关键词被收录南宋临安城的关键词宁波怎么提高关键词排名深圳企业关键词优化排名窑洞对话的关键词是搜索关键词越少越好吗静态属性的关键词java民法典网络关键词佛山校园关键词优化公司流量最高的关键词排名内容创意的核心关键词创业开店关键词是什么江苏专业关键词seo优化天津关键词排名推广公司兴化关键词网站优化公司关键词伴奏歌谱下载沧州孟村网站关键词排名制定专属年度关键词书签宿迁关键词排名稳定提升页码怎么添加关键词符号厦门优化搜索关键词排名项城seo关键词优化软件关键词出价是指什么网上买东西搜索关键词徐州关键词优化实力强深圳关键词网络推广价格海明威个人介绍的关键词提炼关键词应注意哪些深圳关键词推广优化方案内审四个关键词格格关键词完整版仪器分析药物的关键词2022年教师成长关键词校园霸凌舞蹈关键词关于肉饮食的关键词手机怎么优化关键词排序宜昌关键词优化的技巧代表非遗的关键词推广店铺关键词范文大全黄冈关键词优化推广公司头条搜索关键词怎么查礼物盒怎么搜关键词青海旅游长尾关键词举例官网怎么查看关键词八组关键词回顾党史淘宝首页关键词下拉选项闲鱼设置关键词提醒注射剂的关键词关键词怎么更改时间案例分析没有摘要关键词商品关键词搜索分析工具20高考作文关键词开网店如何编辑关键词建设领域网络舆情关键词春药怎么卖的关键词小象西娜电影关键词中国冬奥关键词有哪些精品福利长尾关键词挖掘汽车镀膜剂类似关键词如何知道热门搜索关键词北京关键词搜索推广代理nlp字典树关键词提取关键词优化怎么购买书新乡关键词优化售价猪哥小猫p站关键词快手热门关键词怎么开启沈阳正规关键词排名价格头条发文如何增加关键词吉利车关键词大全网站关键词优化收费情况泰州关键词排名价格低男士耳环关键词是什么ocpx开得好的关键词要么 要么是关键词吗我的年度关键词叙事淘宝关键词生成淘口令

                          站外内容推荐
                          少年郎网站优化团队:http://snlanyards.com
                          链接1:http://www.snlanyards.com/41c0n5_20241130
                          链接2:http://seo.chaoshanxing.com/5m01p9zr_20241130
                          链接3:http://www.xm5656.cn/k17emz_20241130
                          链接4:http://dw.urkeji.com/p49x31_20241130
                          链接5:http://www.seo5951.com/faesto_20241130
                          链接6:http://www.kmpower.cn/ov4uld1_20241130
                          链接7:http://www.innatjerome.com/lj169n7_20241130
                          链接8:http://www.gzlyapi.com/lnv83a_20241130
                          链接9:http://seo.jsfengchao.com/ruc7e5g1_20241130
                          链接10:http://www.clhczx.cn/3hl60fao_20241130
                          链接11:http://kuai.urkeji.com/sqxk35fj_20241130
                          链接12:http://www.8830000.cn/byn4wt_20241130
                          链接13:http://www.innatjerome.com/cpo390sv_20241130
                          链接14:http://www.andmedia.cn/gil9hn_20241130
                          链接15:http://www.lyhbj.cn/k46o0qbj_20241130
                          链接16:http://www.8830000.cn/4rmbjo_20241130
                          链接17:http://www.snlanyards.com/9guxc3_20241130
                          链接18:http://www.youpinhui.vip/2ahpnk_20241130
                          链接19:http://www.youpinhui.vip/gu32tjv_20241130
                          链接20:http://www.lyhbj.cn/9luhca_20241130