# 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) 库。 本文叙述的是如何安装设置库本身。有关如何使用 CozoDB(CozoScript)的信息,见 [文档](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): 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): 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 ```