每个人都应该学的数据库:Lowdb 3.0

6,703 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

谈起数据库,大家往往会说mySQL,Mongodb,Redis等等,但实际上这些数据库往往是用于大型软件或系统的,当我们构建一些简单的server,你应该想起来:Lowdb

什么是Lowdb

lowdb是一个本地的json文件数据库,简单来说就是用一个json文件来充当数据库,来实现增删改查这些数据库的基本的功能。 lowdb具有如下优点:

  • 轻量化
  • 纯js实现
  • 更好的typescript支持
  • 原子化写入:简单理解就是不会错误写入,你指定A,就会写入A,这对数据库十分重要

何时使用

当你构建一些简单的server,或者app的时候。你不需要搞一个服务器,装mySQL,配置权限,再本地连接,然后选择一个orm,再下来才是写你的业务代码。

现在使用lowdb,只需要新建一个json文件就行了。

基本使用

安装

npm install lowdb

初始化

lowdb 3.0使用了ESM+typescript重写,与之前2.0都有一些变化,首先你要保证你的项目是ESM,后续我也会写一篇文章告诉你node如何使ESM。

  • 首先新建一个空文件夹 并初始化
 sudo mkdir lowdb
 cd lowdb
 npm init -y
  • 打开package.json,新增一个"type":"moudle"

  • 新建基本目录

sudo mkdir src
sudo mkdir db
  • 我们在db下新建一个文件data.json,在src下新建db.js

基本目录如下图所示

├─src
│  ├─db.js
├─data
│  ├─data.json
----

现在开始引入lowdb,首先你需要读取data.json的路径,然后lowdb会生成读写适配器,类似于viewMode来读写这个json文件。

import { join, dirname } from 'path'
import { Low, JSONFile } from 'lowdb'
import { fileURLToPath } from 'url'

const __dirname = dirname(fileURLToPath(import.meta.url));

// Use JSON file for storage
const file = join(__dirname, '../data/db.json')
console.log('data path --->',file)
const adapter = new JSONFile(file)
const db = new Low(adapter)
export default db

API

read

读取文件

await db.read()
console.log(db.data)

write

写入数据

await db.write()

这里其实lowdb3新更新的api,我大概可以想的,read的时候时把文件读取到db.data中,这里其实是一个对象,然后你可以随便去修改,最后通过write写入。

await db.read()
db.data = {
    list:[]
}
db.data.list.push(1,2,3)
await db.write()

最后data.json应该就是

{
    "list":[1,2,3]
}

这里需要注意不要频繁调用read和write,因为可能会有性能问题。

Lodash API

lowdb3.0还支持使用lodash的api,我们需要继承一下Low这个类

import lodash from 'lodash'

type Post = {
  id: number;
  title: string;
}

type Data = {
  posts: Post[]
}

// Extend Low class with a new `chain` field
class LowWithLodash<T> extends Low<T> {
  chain: lodash.ExpChain<this['data']> = lodash.chain(this).get('data')
}

const adapter = new JSONFile<Data>('db.json')
const db = new LowWithLodash(adapter)
export default db

使用的时候通过db.chain这个API,具体其他API你可以在ts直接看见

const post = db.chain
  .get('posts')
  .find({ id: 1 })
  .value()

各种适配器Adapter

lowdb的强大之处就是提供了各种适配器,在前文中我使用了JSONFile这个适配器,这其实是一个异步的JSON文件适配器,常用的有

  • JSONFile 异步的JSON文件
  • JSONFileSync 同步的JSON文件
  • Memory 异步的使用内存
  • MemorySync 同步的使用内存
  • LocalStorage 本地存储,使用这个要注意空间大小
  • TextFile 异步的纯文本,主要用于自定义适配器
  • TextFileSync异步的纯文本,主要用于自定义适配器 同时,lowdb还支持自定义适配器,你可以适配各种文件格式,数据类型

限制

官方文档中推荐lowdb的文件大小不超过100MB,因为在js中,格式化json主要用JSON.parse()JSON.stringify,当超过100MB之后会有无法避免的性能问题。还有如果你使用localStorage, 限制应该是5MB这也是我一开就说应用于小型服务的原因。

最后这里贴一下lowdb地址 github.com/typicode/lo…