V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SQLite
papaer
V2EX  ›  SQLite

大家有用 Sqlite 的吗,都是什么场景下要用这个,能说一两点非要用它的理由最好啦

  •  
  •   papaer · 2022-03-03 09:54:06 +08:00 · 8735 次点击
    这是一个创建于 1001 天前的主题,其中的信息可能已经有所发展或是发生改变。
    55 条回复    2022-03-04 09:35:38 +08:00
    LANB0
        1
    LANB0  
       2022-03-03 09:55:47 +08:00   ❤️ 1
    嵌入式设备,内存、CPU 和 flash 性能都有限,跑不了大型数据库。主要以 C/C++开发,sqlite 有良好的 C 接口提供。
    adoal
        2
    adoal  
       2022-03-03 09:57:16 +08:00
    不用部署,就一个本机数据文件。
    roundgis
        3
    roundgis  
       2022-03-03 09:58:32 +08:00 via Android
    server side

    mobile app

    就是方便而已

    https://sqlite.org/whentouse.html
    watcher
        4
    watcher  
       2022-03-03 09:59:59 +08:00
    server side
    lisongeee
        5
    lisongeee  
       2022-03-03 10:00:18 +08:00   ❤️ 2
    android 默认支持 Sqlite ,所以用 Sqlite ,另外本地应用存储数据量大的时候也适合 Sqlite ,用 json 或者 xml 这类只能整存整取,数据量大的时候会 io 阻塞比较严重
    iyear
        6
    iyear  
       2022-03-03 10:02:19 +08:00 via Android
    单文件应用工具用着真的爽,应用本身性质也决定了不用特别强的数据库。sqlite+go 真的爽
    BingoXuan
        7
    BingoXuan  
       2022-03-03 10:03:30 +08:00
    你需要一个数据库的功能,但又不想或没条件启动独立数据库进程,那就选 sqlite 。python 有 sqlitedict 这个库,能把字典持久化。连 orm 都省了
    felixcode
        8
    felixcode  
       2022-03-03 10:05:36 +08:00 via Android   ❤️ 1
    与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程,可以按应用程序需求进行静态或动态连接。SQLite 直接读取和写入普通磁盘文件,具有多个表,索引,触发器和视图的完整 SQL 数据库包含在单个磁盘文件中。
    wangtian2020
        9
    wangtian2020  
       2022-03-03 10:06:01 +08:00
    electron 要存订单信息、作业信息,几百条数据。数据大到不适合 localstorage ,但又不至于上大数据库,数据库要在程序内置
    youthfire
        10
    youthfire  
       2022-03-03 10:07:34 +08:00 via iPhone
    本地 Python+sqlite ,不连接外网,速度快
    RickyC
        11
    RickyC  
       2022-03-03 10:09:13 +08:00
    数据库免安装,免部署。比如 showdoc 。
    icyalala
        12
    icyalala  
       2022-03-03 10:13:07 +08:00
    手机里到处都是 sqlite ,比如 iOS/Android 的短信、通信录、邮件等数据都是 sqlite 存储的,各个 App 比如微信聊天记录、复杂配置也都是 sqlite ,无处不在。

    对于需要存储关系模型、需要查询、又没有太高的安全性和事务处理需求的地方,都适合用 sqlite ,移动端尤为适合。
    dooonabe
        13
    dooonabe  
       2022-03-03 10:14:03 +08:00 via Android
    说个反例:现在做的仿知乎 web 项目,cto 让给每个用户的三四个用户相关表创建独立的 db ,曰提高并发,降低死锁概率
    wonderfulcxm
        14
    wonderfulcxm  
       2022-03-03 10:16:11 +08:00 via iPhone
    买了个万网的那啥共享空间挂域名,想做点东西,一看,mysql 只有 50m ,那只能用 sqlite 了
    Vegetable
        15
    Vegetable  
       2022-03-03 10:23:22 +08:00
    手机里多的是吧。你可以理解为,客户端需要使用数据库的时候,文件型数据库几乎是唯一选择。
    aegon466
        16
    aegon466  
       2022-03-03 10:25:46 +08:00
    @iyear 请教下 我用 sqlite+go 在 win 上编译后放到 linux 运行不了 说是编译不了 gcc 是什么原因
    izzy27
        17
    izzy27  
       2022-03-03 10:28:28 +08:00
    轻量呗,一些小项目用 sqlite 足够了
    zjj19950716
        18
    zjj19950716  
       2022-03-03 10:35:33 +08:00
    @aegon466 要 cgo ,你可以用 pure go 版本的 sqlite 库,就是性能差点
    Nich0la5
        19
    Nich0la5  
       2022-03-03 10:42:58 +08:00
    主要是本地应用 内置到应用包不用额外部署,单线程下性能不错,没有用户权限体系。反正你当个更高级的配置文件用就好
    ps 高并发下不建议用,之前我们的 gitea 后端是个 sqlite 天天卡住,换 mysql 就没事了
    wangjiang
        20
    wangjiang  
       2022-03-03 10:46:28 +08:00
    @wangtian2020 #9 为啥不用 IndexDB
    CoCoMcRee
        21
    CoCoMcRee  
       2022-03-03 11:12:35 +08:00
    app 内置数据库, 大量数据 app 本地存储, 就是用的 sqlite
    cmdOptionKana
        22
    cmdOptionKana  
       2022-03-03 11:36:52 +08:00
    sqlite 优点多:稳定可靠(真的身经百战,极难撞到 bug 了)、运行效率高占用资源小、备份容易、支持广泛(几乎一切语言都可以操作同一个数据库文件)、关系型数据库功能比 kv 多,便于编程。

    虽然 kv 数据库也具有 sqlite 的多数优点,但 kv 通常用起来是麻烦一点,很多操作需要额外编程处理。
    libook
        23
    libook  
       2022-03-03 11:41:22 +08:00
    见到最多的场景就是客户端上需要比较强的数据查询能力,跑个常规数据库太重了,SQLite 比较轻量,容易打包到客户端安装包里,跟常规关系型数据库的使用方式差别较小。

    还有一个场景是做原型产品,很多 ORM 可以支持多种数据库,避免折腾常规数据库服务可以先挂个 SQLite ,后面产品化的时候迁移到正式数据库成本也不会很高。
    littlewing
        24
    littlewing  
       2022-03-03 11:49:04 +08:00
    客户端 APP 本地保存一些数据
    Akitora
        25
    Akitora  
       2022-03-03 11:59:08 +08:00 via Android
    @aegon466 cgo 开启时默认不支持交叉编译,可以试试用 wsl 编译
    imn1
        26
    imn1  
       2022-03-03 12:02:59 +08:00
    “非要”这个词,估计只有“无网+便携”场景可以符合
    如果只是问选择理由
    0. 便携场景
    1. 我写了几个单机程序,基本都是用 sqlite ,因为没什么并发,没必要装服务端数据库
    2. 单用户不定设备同步,只需要同步一个数据库文件就可以了,因为单用户甚少同时操作两个设备。同时指的是秒级或更高频手动操作,不是指软件自动运算写数据库


    还有一个场景,但比较少见,就是目的是数据共享、分发给不定人群,至于他怎么用这些数据,并非主要目的,github 上一些项目就是这样,分享的不是代码,而是数据
    devld
        27
    devld  
       2022-03-03 12:05:34 +08:00
    自己的小项目,想要一键无痛启动。
    GoLand
        28
    GoLand  
       2022-03-03 12:28:37 +08:00 via iPhone
    单元测试用 sqlite 来 mock MySQL
    ackfin01
        29
    ackfin01  
       2022-03-03 12:39:31 +08:00
    最主要就是方便啊 而且性能也满足
    dany813
        30
    dany813  
       2022-03-03 12:42:15 +08:00
    小巧,方便
    leavic
        31
    leavic  
       2022-03-03 13:26:33 +08:00
    不需要服务器
    kingfalse
        32
    kingfalse  
       2022-03-03 13:37:27 +08:00
    各种工控客户端机器,手机 app,等
    james2013
        33
    james2013  
       2022-03-03 13:48:31 +08:00
    android 手机上就这个数据库最方便好用
    smallpython
        34
    smallpython  
       2022-03-03 13:49:56 +08:00
    sqlite 这种文件型数据库有对应的 nosql 吗
    37Y37
        35
    37Y37  
       2022-03-03 13:50:55 +08:00 via Android
    我的博客数据库就用的 sqlite ,小巧方便,不用安装
    bthulu
        36
    bthulu  
       2022-03-03 14:16:15 +08:00
    典型案例: 微信客户端
    star7th
        37
    star7th  
       2022-03-03 14:39:59 +08:00
    我的开源软件 showdoc:

    https://github.com/star7th/showdoc

    就使用 sqlite .

    showdoc 使用 Sqlite 的理由如下:

    PHP 环境默认支持 Sqlite ,所以只需要安装好 PHP 环境,即可使用 showdoc ,无须再安装 mysql 。这对于不懂 mysql 的开发者(如 App 开发者)来说会更容易一些。同时方便官方维护 showdoc ,不用维护和测试两个数据库版本

    sqlite 的性能并不差,对于总项目数在一万以内的情况,基本不用考虑性能问题。所以完全足够普通公司或者团队的使用。关于对 sqlite 性能的质疑,可以参考这位不知名网友的文章 https://www.cnblogs.com/derekhan/p/10897421.html

    sqlite 数据库文件放在 /Sqlite 目录下,迁移和备份都十分简单,直接复制 /转移该目录即可
    MoeWang
        38
    MoeWang  
       2022-03-03 14:47:46 +08:00 via Android
    博客,数据量小,单独开个数据库性能过剩,索性 sqlite ,缓存好了速度很快。轻量也好迁移。
    MarquesMa
        39
    MarquesMa  
       2022-03-03 14:59:45 +08:00
    客户端里内嵌很常见,比如手机,桌面应用等等

    另外如果在服务器的话,存文件很不错

    还有就是小应用单台机器起步的时候也可以简单用下
    Buges
        40
    Buges  
       2022-03-03 15:06:56 +08:00 via Android
    @aegon466 交叉编译可以利用 zig ( zig 受 go 启发,能像 go 一样简单的交叉编译 c 代码)
    https://dev.to/kristoff/zig-makes-go-cross-compilation-just-work-29ho
    imklay
        41
    imklay  
       2022-03-03 15:27:45 +08:00
    @wangtian2020 #9 这种场景是不是也可以考虑 IndexDB ?
    shellc
        42
    shellc  
       2022-03-03 15:45:11 +08:00
    我的回复在这里: https://v2ex.com/t/837714

    单立一贴的原因是,跑题说了另一件事
    Jason86
        43
    Jason86  
       2022-03-03 15:51:11 +08:00
    移动端的项目
    soulzz
        44
    soulzz  
       2022-03-03 16:11:03 +08:00
    blog 场景下

    迁移 blog 可能只需要 commit 下 docker 镜像 直接迁移就可以
    或者直接复制过去,没有任何迁移成本
    joApioVVx4M4X6Rf
        45
    joApioVVx4M4X6Rf  
       2022-03-03 16:28:15 +08:00
    @star7th 这个开源真的很牛,上家公司离线环境用了很久
    wangtian2020
        46
    wangtian2020  
       2022-03-03 16:44:49 +08:00
    @wangjiang
    @imklay
    indexDB 是啥我刚刚搜索之前还真不知道。应该没有 sqlite 作为一个有形的文件方便,我更新程序的话可以手动迁移数据库。
    吐槽:臭甲方提供的更新订单接口一次性返回 300+条数据,我一次性往 sqlite 中插入 1100+条数据,164KB 大小,node 线程要卡两秒钟(用了 Promise.all )
    tairan2006
        47
    tairan2006  
       2022-03-03 16:45:58 +08:00
    各种客户端 /边缘端环境都经常使用,服务端倒是用得不多
    Ciallo
        48
    Ciallo  
       2022-03-03 17:57:16 +08:00
    客户端开发我自己用过几次,或者是离线的工具或服务
    ilylx2008
        49
    ilylx2008  
       2022-03-03 17:59:01 +08:00
    单机环境,copy 带走,批量写入性能不错。并发读写不行。
    jianghu52
        50
    jianghu52  
       2022-03-03 18:18:45 +08:00
    我给人做了一个.net 的流水明细转化系统,为了存一些发票头,还用 sqlite 呢。一个轻,另外一个是不用在别人系统上装什么其他的东西。
    0x2CA
        51
    0x2CA  
       2022-03-03 18:33:28 +08:00
    我这边是游戏开发,会用到,策划配表大量数据,全加载内存占用内存,而且加载慢,通常游戏进程原因只会用到配置一部分数据,所以选择 sqlite ,使用查询不占用内存直接获取配置是最好的选择,而且通常是只读不写,只做配置数据库
    biubiuF
        52
    biubiuF  
       2022-03-04 02:04:08 +08:00
    本地数据
    jupiter157
        53
    jupiter157  
       2022-03-04 04:11:25 +08:00
    数据有四个操作:创建,读取,修改,删除。
    数据可以以多种形式存储,比如常见的文本文件,格式可以是 json ,csv 或甚至二进制。它们的局限在于,对于任何数据操作,都需要整个文件读取,即使你只需要添加 /查询十万条记录中的某一条,因此效率十分低下。有些文件格式,例如 nc ,也支持片段读入,但是需要预先指定位置。
    鉴于此,数据库可以实现按需查询、读取和写入,减少 io 负担。
    sqlite 是很轻量化的数据库。
    sqlite 的缺点是:对高并发写入支持差;只能本地调用;支持数据不能太大(几十 G 没问题)

    应用场景是:需要经常更新和添加数据中的很小一部分;需要经常查询数据并返回一小部分。
    博客没必要上数据库,文本就够了。
    feelinglucky
        54
    feelinglucky  
       2022-03-04 09:14:19 +08:00
    @GoLand 如果是 Java 技术栈的话,我还是习惯用 H2 来 mock 数据库做单元测试(话说兄弟的 ID 好亮眼,甚至怀疑是不是潜规则了站长,哈哈哈
    yiqiao
        55
    yiqiao  
       2022-03-04 09:35:38 +08:00
    单元测试我用它
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1091 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 19:34 · PVG 03:34 · LAX 11:34 · JFK 14:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.