You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.4 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Cozo NodeJS 库
[![cozo-node](https://img.shields.io/npm/v/cozo-node)](https://www.npmjs.com/package/cozo-node)
NodeJS 的嵌入式 [CozoDB](https://www.cozodb.org) 库。
本文叙述的是如何安装设置库本身。有关如何使用 CozoDBCozoScript的信息见 [文档](https://docs.cozodb.org/zh_CN/latest/index.html) 。
## 安装
```bash
npm install --save cozo-node
```
安装过程中需要从 [GitHub 发布页](https://github.com/cozodb/cozo-lib-nodejs/releases/) 下载二进制文件。如果因为网络问题失败,可以使用此 [镜像](https://github.com/cozodb/cozo-lib-nodejs/releases/) ,使用方法为
```bash
npm install --save cozo-node --cozo_node_prebuilt_binary_host_mirror=https://gitee.com/cozodb/cozo-lib-nodejs/releases/download/
```
注意:如果你用的是 Yarn 而不是 NPM类似的命令 [可能不奏效](https://github.com/mapbox/node-pre-gyp/issues/514) 。
如果你的操作系统、平台不是常见的平台,可能会报错说找不到预编译库。这种情况下可以参见后面关于如何从源码编译的内容。
## 用法
```javascript
const {CozoDb} = require('cozo-node')
const db = new CozoDb()
function printQuery(query, params) {
db.run(query, params)
.then(data => console.log(data))
.catch(err => console.error(err.display || err.message))
}
printQuery("?[] <- [['hello', 'world!']]")
printQuery("?[] <- [['hello', 'world', $name]]", {"name": "JavaScript"})
printQuery("?[a] <- [[1, 2]]")
```
### 基本 API
```ts
class CozoDb {
/**
* 构造函数
*
* @param engine: 默认为 'mem',即纯内存的非持久化存储。其他值可以是 'sqlite'、'rocksdb' 等
* @param path: 存储文件或文件夹的路径,默认为 'data.db'。在 'mem' 引擎下无用。
* @param options: 默认为 {},在 NodeJS 支持的引擎中无用。
*/
constructor(engine: string, path: string, options: object): CozoDb;
/**
* 关闭数据库,并释放其原生资源。如果不调用此方法而直接删除数据库的变量,则会造成原生资源泄漏。
*/
close(): void;
/**
* 执行查询文本
*
* @param script: 查询文本
* @param params: 传入的参数,默认为 {}
*/
async run(script: string, params: object): object;
/**
* 导出存储表
*
* @param relations: 需要导出的存储表名称
*/
async exportRelations(relations: Array<string>): object;
/**
* 导入数据至存储表
*
* 注意:以此方法导入数据不会激活存储表上任何的触发器。
*
* @param data: 导入的表以及数据,格式与 `exportRelations` 返回的相同
*/
async importRelations(data: object): object;
/**
* 备份数据库
*
* @param path: 备份文件路径
*/
async backup(path: string): object;
/**
* 从备份文件恢复数据至当前数据库。若当前数据库非空,则报错。
*
* @param path: 备份文件路径
*/
async restore(path: string): object;
/**
* 将备份文件中指定存储表里的数据插入当前数据库中同名表里。
*
* 注意:以此方法导入数据不会激活存储表上任何的触发器。
*
* @param path: 备份文件路径
* @param rels: 需导入数据的表名
*/
async importRelationsFromBackup(path: string, rels: Array<string>): object;
}
```
更多信息 [见此](https://docs.cozodb.org/zh_CN/latest/nonscript.html) 。
### 进阶 API
Cozo 支持多语句事务、存储表更新时回调以及使用 NodeJS 实现自定义固定规则,与 [Python 库](https://github.com/cozodb/pycozo) [国内镜像](https://gitee.com/cozodb/pycozo))所支持的差不多。可参考此 [示例](./example.js)。
## 编译
编译 `cozo-node` 需要 [Rust 工具链](https://rustup.rs)。运行
```bash
cargo build --release -p cozo-node -F compact -F storage-rocksdb
```
完成后,动态链接库可以在 `../target/` 文件夹中找到(具体文件名根据平台与操作系统会有差异,一般来说 Linux 上 扩展名为 `.so`Mac 上为 `.dylib`Windows 上为 `.dll`)。
将找到的动态库拷贝为此目录下的 `native/6/cozo_node_prebuilt.node` 文件(中间目录若不存在,则需建立)。
如果一切操作正确,在此目录下执行下列命令则会正常返回:
```bash
node example.js
```