On this page

Source Code: lib/sqlite.js

稳定性:1.2 - 发布候选版本。

node:sqlite 模块用于方便地操作 SQLite 数据库。 要访问它:

此模块仅在 node: 方案下可用。

以下示例展示了 node:sqlite 模块的基本用法,用于打开 一个内存数据库,向数据库写入数据,然后读回数据。

import { DatabaseSync } from 'node:sqlite';
const database = new DatabaseSync(':memory:');

// 从字符串执行 SQL 语句。
database.exec(`
  CREATE TABLE data(
    key INTEGER PRIMARY KEY,
    value TEXT
  ) STRICT
`);
// 创建一个预准备语句以将数据插入数据库。
const insert = database.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
// 执行绑定了值的预准备语句。
insert.run(1, 'hello');
insert.run(2, 'world');
// 创建一个预准备语句以从数据库读取数据。
const query = database.prepare('SELECT * FROM data ORDER BY key');
// 执行预准备语句并记录结果集。
console.log(query.all());
// 输出:[ { key: 1, value: 'hello' }, { key: 2, value: 'world' } ]

当 Node.js 写入或读取 SQLite 时,需要在 JavaScript 数据类型和 SQLite 的 [数据类型][] 之间进行转换。因为 JavaScript 支持 比 SQLite 更多的数据类型,所以只支持 JavaScript 类型的子集。 尝试将不支持的数据类型写入 SQLite 将导致 异常。

存储类JavaScript 到 SQLiteSQLite 到 JavaScript
NULL<null><null>
INTEGER<number><bigint><number><bigint> (可配置)
REAL<number><number>
TEXT<string><string>
BLOB<TypedArray><DataView><Uint8Array>

从 SQLite 读取值的 API 有一个配置选项,用于确定 INTEGER 值在 JavaScript 中是转换为 number 还是 bigint, 例如语句的 readBigInts 选项和用户定义函数的 useBigIntArguments 选项。如果 Node.js 从 SQLite 读取的 INTEGER 值超出 JavaScript [安全整数][] 范围,且未启用读取 BigInt 的选项,则将抛出 ERR_OUT_OF_RANGE 错误。

此类表示到 SQLite 数据库的单个 [连接][]。此类暴露的所有 API 均同步执行。

new DatabaseSync(path, options?): void
Attributes
数据库的路径。SQLite 数据库可以 存储在文件中或完全 [在内存中][]。要使用基于文件的数据库, 路径应为文件路径。要使用内存数据库,路径 应为特殊名称  ':memory:'
options:<Object>
数据库连接的配置选项。支持 以下选项:
如果为  true ,数据库由构造函数打开。当 此值为 false 时,必须通过 open() 方法打开数据库。 默认: true
readOnly:<boolean>
如果为  true ,数据库以只读模式打开。 如果数据库不存在,打开它将失败。 默认: false
enableForeignKeyConstraints:<boolean>
如果为  true ,则启用外键约束。 推荐使用,但为了与旧数据库模式兼容可以禁用。外键约束的执行可以在 打开数据库后使用 PRAGMA foreign_keys 启用和禁用。 默认: true
enableDoubleQuotedStringLiterals:<boolean>
如果为  true ,SQLite 将接受 [双引号字符串字面量][]。不推荐使用,但为了与旧数据库模式兼容可以 启用。 默认: false
allowExtension:<boolean>
如果为  true ,则启用 loadExtension SQL 函数 和 loadExtension() 方法。 你可以稍后调用 enableLoadExtension(false) 来禁用此功能。 默认: false
timeout:<number>
[繁忙超时][](毫秒)。这是 SQLite 在返回错误之前等待数据库锁释放的最大时间量。 默认: 0
readBigInts:<boolean>
如果为  true ,整数字段作为 JavaScript BigInt 值读取。如果为 false , 整数字段作为 JavaScript 数字读取。 默认: false
returnArrays:<boolean>
如果为  true ,查询结果作为数组返回而不是对象。 默认: false
allowBareNamedParameters:<boolean>
如果为  true ,允许绑定不带前缀 字符的命名参数(例如, foo 而不是 :foo )。 默认: true
allowUnknownNamedParameters:<boolean>
如果为  true ,绑定时忽略未知的命名参数。 如果为 false ,则对未知的命名参数抛出异常。 默认: false
defensive:<boolean>
如果为  true ,则启用防御标志。当启用防御标志时, 允许普通 SQL 故意破坏数据库文件的语言功能将被禁用。 防御标志也可以使用 enableDefensive() 设置。 默认: true
limits:<Object>
各种 SQLite 限制的配置。这些限制 可用于在处理潜在恶意输入时防止过度消耗资源。详见 SQLite 文档中的  运行时限制限制常量 。默认值由 SQLite 的编译时默认值确定,并可能因 SQLite 的构建方式而异。支持以下属性:
length:<number>
字符串或 BLOB 的最大长度。
sqlLength:<number>
SQL 语句的最大长度。
column:<number>
最大列数。
exprDepth:<number>
表达式树的最大深度。
compoundSelect:<number>
复合 SELECT 中的最大项数。
vdbeOp:<number>
VDBE 指令的最大数量。
functionArg:<number>
函数参数的最大数量。
attach:<number>
附加数据库的最大数量。
likePatternLength:<number>
LIKE 模式的最大长度。
variableNumber:<number>
SQL 变量的最大数量。
triggerDepth:<number>
触发器递归的最大深度。

构造一个新的 DatabaseSync 实例。

M

database.aggregate

History
database.aggregate(name, options): void

向 SQLite 数据库注册一个新的聚合函数。此方法是 sqlite3_create_window_function() 的包装器。

Attributes
要创建的 SQLite 函数的名称。
options:<Object>
函数配置设置。
deterministic:<boolean>
如果为  true ,则在创建的函数上设置 SQLITE_DETERMINISTIC 标志。 默认: false
directOnly:<boolean>
如果为  true ,则在创建的函数上设置 SQLITE_DIRECTONLY 标志。 默认: false
useBigIntArguments:<boolean>
如果为  trueoptions.stepoptions.inverse 的整数参数 转换为 BigInt 。如果为 false ,整数参数作为 JavaScript 数字传递。 默认: false
varargs:<boolean>
如果为  trueoptions.stepoptions.inverse 可以使用任意数量的 参数调用(介于零和 SQLITE_MAX_FUNCTION_ARG 之间)。如果为 falseinversestep 必须使用恰好 length 个参数调用。 默认: false
聚合函数的身份 值。当聚合函数初始化时使用此值。当传递 <Function> 时,身份值将是其返回值。
为聚合中的每一行调用的函数。该 函数接收当前状态和行值。此函数的返回值应为新状态。
result:<Function>
调用以获取聚合结果的函数。该函数接收最终状态并应返回聚合的 结果。
inverse:<Function>
当提供此函数时, aggregate 方法将作为窗口函数工作。 该函数接收当前状态和丢弃的行值。此函数的返回值应为 新状态。

当用作窗口函数时,result 函数将被调用多次。

const { DatabaseSync } = require('node:sqlite');

const db = new DatabaseSync(':memory:');
db.exec(`
  CREATE TABLE t3(x, y);
  INSERT INTO t3 VALUES ('a', 4),
                        ('b', 5),
                        ('c', 3),
                        ('d', 8),
                        ('e', 1);
`);

db.aggregate('sumint', {
  start: 0,
  step: (acc, value) => acc + value,
});

db.prepare('SELECT sumint(y) as total FROM t3').get(); // { total: 21 }
M

database.close

History
database.close(): void

关闭数据库连接。如果数据库未 打开,则抛出异常。此方法是 sqlite3_close_v2() 的包装器。

M

database.loadExtension

History
database.loadExtension(path): void
Attributes
要加载的共享库的路径。

将共享库加载到数据库连接中。此方法是 sqlite3_load_extension() 的包装器。构造 DatabaseSync 实例时需要启用 allowExtension 选项。

M

database.enableLoadExtension

History
database.enableLoadExtension(allow): void
Attributes
allow:<boolean>
是否允许加载扩展。

启用或禁用 loadExtension SQL 函数和 loadExtension() 方法。当构造时 allowExtensionfalse 时,出于安全原因无法启用 加载扩展。

M

database.enableDefensive

History
database.enableDefensive(active): void
Attributes
active:<boolean>
是否设置防御标志。

启用或禁用防御标志。当防御标志激活时, 允许普通 SQL 故意破坏数据库文件的语言功能将被禁用。 详见 SQLite 文档中的 SQLITE_DBCONFIG_DEFENSIVE

M

database.location

History
database.location(dbName?): void
Attributes
dbName:<string>
数据库名称。这可以是  'main' (默认主数据库)或任何已通过 ATTACH DATABASE 添加的其他数据库。 默认: 'main'
返回值: <string> | <null> 数据库文件的位置。当使用内存数据库时, 此方法返回 null。

此方法是 sqlite3_db_filename() 的包装器。

M

database.exec

History
database.exec(sql): void
Attributes
要执行的 SQL 字符串。

此方法允许执行一个或多个 SQL 语句而不返回 任何结果。当执行从文件读取的 SQL 语句时,此方法很有用。此方法是 sqlite3_exec() 的包装器。

M

database.function

History
database.function(name, options?, fn): void
Attributes
要创建的 SQLite 函数的名称。
options:<Object>
函数的可选配置设置。支持 以下属性:
deterministic:<boolean>
如果为  true ,则在创建的函数上设置 SQLITE_DETERMINISTIC 标志。 默认: false
directOnly:<boolean>
如果为  true ,则在创建的函数上设置 SQLITE_DIRECTONLY 标志。 默认: false
useBigIntArguments:<boolean>
如果为  truefunction 的整数参数 转换为 BigInt 。如果为 false ,整数参数作为 JavaScript 数字传递。 默认: false
varargs:<boolean>
如果为  truefunction 可以使用任意数量的 参数调用(介于零和 SQLITE_MAX_FUNCTION_ARG 之间)。如果为 falsefunction 必须使用恰好 function.length 个参数调用。 默认: false
当调用 SQLite 函数时要调用的 JavaScript 函数。 此函数的返回值应为有效的 SQLite 数据类型: 详见  JavaScript 和 SQLite 之间的类型转换 。如果返回值为 undefined ,则结果默认为 NULL

此方法用于创建 SQLite 用户定义函数。此方法是 sqlite3_create_function_v2() 的包装器。

M

database.setAuthorizer

History
database.setAuthorizer(callback): void
Attributes
callback:<Function> | <null>
要设置的授权器函数,或  null 以 清除当前授权器。

设置一个授权器回调,每当 SQLite 尝试通过预准备语句 访问数据或修改数据库模式时,将调用该回调。 这可用于实施安全策略、审计访问或限制某些操作。 此方法是 sqlite3_set_authorizer() 的包装器。

调用时,回调接收五个参数:

Attributes
actionCode:<number>
正在执行的操作类型(例如,  SQLITE_INSERTSQLITE_UPDATESQLITE_SELECT )。
第一个参数(取决于上下文,通常是表名)。
第二个参数(取决于上下文,通常是列名)。
dbName:<string> | <null>
数据库名称。
triggerOrView:<string> | <null>
导致访问的触发器或视图的名称。

回调必须返回以下常量之一:

  • SQLITE_OK - 允许操作。
  • SQLITE_DENY - 拒绝操作(导致错误)。
  • SQLITE_IGNORE - 忽略操作(静默跳过)。
const { DatabaseSync, constants } = require('node:sqlite');
const db = new DatabaseSync(':memory:');

// 设置一个拒绝所有表创建的授权器
db.setAuthorizer((actionCode) => {
  if (actionCode === constants.SQLITE_CREATE_TABLE) {
    return constants.SQLITE_DENY;
  }
  return constants.SQLITE_OK;
});

// 这将正常工作
db.prepare('SELECT 1').get();

// 由于授权拒绝,这将抛出错误
try {
  db.exec('CREATE TABLE blocked (id INTEGER)');
} catch (err) {
  console.log('Operation blocked:', err.message);
}
P

database.isOpen

History
  • 类型:<boolean> 数据库当前是否打开。
P

database.isTransaction

History
P

database.limits

History

一个用于在运行时获取和设置 SQLite 数据库限制的对象。 每个属性对应一个 SQLite 限制,可以读取或写入。

const db = new DatabaseSync(':memory:');

// 读取当前限制
console.log(db.limits.length);

// 设置新限制
db.limits.sqlLength = 100000;

// 将限制重置为其编译时最大值
db.limits.sqlLength = Infinity;

可用属性:lengthsqlLengthcolumnexprDepthcompoundSelectvdbeOpfunctionArgattachlikePatternLengthvariableNumbertriggerDepth

将属性设置为 Infinity 会将限制重置为其编译时最大值。

M

database.open

History
database.open(): void

打开 DatabaseSync 构造函数的 path 参数中指定的数据库。 此方法仅应在数据库未通过构造函数打开时使用。如果数据库已打开,则抛出异常。

M

database.prepare

History
database.prepare(sql, options?): void
Attributes
要编译为预准备语句的 SQL 字符串。
options:<Object>
预准备语句的可选配置。
readBigInts:<boolean>
如果为  true ,整数字段作为 BigInt 读取。 默认: 继承自数据库选项或 false
returnArrays:<boolean>
如果为  true ,结果作为数组返回。 默认: 继承自数据库选项或 false
allowBareNamedParameters:<boolean>
如果为  true ,允许绑定不带前缀字符的命名 参数。 默认: 继承自数据库选项或 true
allowUnknownNamedParameters:<boolean>
如果为  true ,忽略未知的命名参数。 默认: 继承自数据库选项或 false
返回值:{StatementSync} 预准备语句。

将 SQL 语句编译为 [预准备语句][]。此方法是 sqlite3_prepare_v2() 的包装器。

M

database.createTagStore

History
database.createTagStore(maxSize?): void
Attributes
maxSize:<integer>
要缓存的预准备语句的最大数量。  默认: 1000
返回值:{SQLTagStore} 一个用于缓存预准备语句的新 SQL 标签存储。

创建一个新的 SQLTagStore,它是一个最近最少使用 (LRU) 缓存, 用于存储预准备语句。这允许通过为预准备语句标记唯一标识符来高效地重用它们。

当执行标记的 SQL 字面量时,SQLTagStore 检查缓存中是否已存在 相应 SQL 查询字符串的预准备语句。如果存在,则使用缓存的语句。如果不存在,则创建 一个新的预准备语句,执行它,然后存储在缓存中供将来使用。此机制 有助于避免重复解析和准备相同 SQL 语句的开销。

标记语句将模板字面量中的占位符值绑定为 底层预准备语句的参数。例如:

等价于:

但是,在第一个示例中,标签存储将缓存底层预准备 语句供将来使用。

注意: 标记语句中的 ${value} 语法将参数 绑定 到 预准备语句。这与 未标记 模板字面量中的行为不同,后者执行字符串插值。

// 这是一个将参数绑定到标记语句的安全示例。
sqlTagStore.run`INSERT INTO t1 (id) VALUES (${id})`;

// 这是一个未标记模板字符串的 *不安全* 示例。
// `id` 作为字符串插值到查询文本中。
// 这可能导致 SQL 注入和数据损坏。
db.run(`INSERT INTO t1 (id) VALUES (${id})`);

如果查询字符串(包括任何绑定占位符的位置)相同,则标签存储将从缓存中匹配语句。

// 以下语句将在缓存中匹配:
sqlTagStore.get`SELECT * FROM t1 WHERE id = ${id} AND active = 1`;
sqlTagStore.get`SELECT * FROM t1 WHERE id = ${12345} AND active = 1`;

// 以下语句将不匹配,因为查询字符串
// 和绑定的占位符不同:
sqlTagStore.get`SELECT * FROM t1 WHERE id = ${id} AND active = 1`;
sqlTagStore.get`SELECT * FROM t1 WHERE id = 12345 AND active = 1`;

// 以下语句将不匹配,因为匹配是区分大小写的:
sqlTagStore.get`SELECT * FROM t1 WHERE id = ${id} AND active = 1`;
sqlTagStore.get`select * from t1 where id = ${id} and active = 1`;

在标记语句中绑定参数的唯一方法是使用 ${value} 语法。不要将参数绑定占位符(? 等)添加到 SQL 查询 字符串本身。

import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync(':memory:');
const sql = db.createTagStore();

db.exec('CREATE TABLE users (id INT, name TEXT)');

// 使用 'run' 方法插入数据。
// 标记字面量用于标识预准备语句。
sql.run`INSERT INTO users VALUES (1, 'Alice')`;
sql.run`INSERT INTO users VALUES (2, 'Bob')`;

// 使用 'get' 方法检索单行。
const name = 'Alice';
const user = sql.get`SELECT * FROM users WHERE name = ${name}`;
console.log(user); // { id: 1, name: 'Alice' }

// 使用 'all' 方法检索所有行。
const allUsers = sql.all`SELECT * FROM users ORDER BY id`;
console.log(allUsers);
// [
//   { id: 1, name: 'Alice' },
//   { id: 2, name: 'Bob' }
// ]
M

database.createSession

History
database.createSession(options?): void
Attributes
options:<Object>
会话的配置选项。
table:<string>
要跟踪更改的特定表。默认情况下,跟踪所有表的更改。
要跟踪的数据库名称。当使用  ATTACH DATABASE 添加了多个数据库时,这很有用。 默认'main'
返回值:{Session} 会话句柄。

创建并将会话附加到数据库。此方法是 sqlite3session_create()sqlite3session_attach() 的包装器。

M

database.applyChangeset

History
database.applyChangeset(changeset, options?): void
Attributes
changeset:<Uint8Array>
二进制变更集或补丁集。
options:<Object>
如何应用更改的配置选项。
filter:<Function>
跳过那些当目标表名提供给此函数时返回真值的更改。 默认情况下,尝试所有更改。
onConflict:<Function>
一个确定如何处理冲突的函数。该函数接收一个参数, 该参数可以是以下值之一:
SQLITE_CHANGESET_DATA:
DELETEUPDATE 更改不包含预期的 "之前" 值。
SQLITE_CHANGESET_NOTFOUND:
:不存在与 DELETEUPDATE 更改的主键匹配的行。
SQLITE_CHANGESET_CONFLICT:
INSERT 更改导致主键重复。
SQLITE_CHANGESET_FOREIGN_KEY:
:应用更改将导致外键违规。
SQLITE_CHANGESET_CONSTRAINT:
:应用更改将导致 UNIQUECHECKNOT NULL 约束 违规。
返回值: <boolean> 变更集是否成功应用而未被中止。

如果数据库未 打开,则抛出异常。此方法是 sqlite3changeset_apply() 的包装器。

import { DatabaseSync } from 'node:sqlite';

const sourceDb = new DatabaseSync(':memory:');
const targetDb = new DatabaseSync(':memory:');

sourceDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');
targetDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');

const session = sourceDb.createSession();

const insert = sourceDb.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
insert.run(1, 'hello');
insert.run(2, 'world');

const changeset = session.changeset();
targetDb.applyChangeset(changeset);
// 现在已应用变更集,targetDb 包含与 sourceDb 相同的数据。
M

database[Symbol.dispose]

History
database[Symbol.dispose](): void

关闭数据库连接。如果数据库连接已关闭, 则此操作为空操作。

类:Session

History
M

session.changeset

History
session.changeset(): void
  • 返回值:<Uint8Array> 可应用于其他数据库的二进制变更集。

检索自变更集创建以来包含所有变更的变更集。可以被多次调用。 如果数据库或会话未打开,则抛出异常。此方法是对 sqlite3session_changeset() 的封装。

M

session.patchset

History
session.patchset(): void
  • 返回值:<Uint8Array> 可应用于其他数据库的二进制补丁集。

与上述方法类似,但生成更紧凑的补丁集。请参阅 SQLite 文档中的 [变更集和补丁集][] 。如果数据库或会话未打开,则抛出异常。此方法是 对 sqlite3session_patchset() 的封装。

session.close(): void

关闭会话。如果数据库或会话未打开,则抛出异常。此方法是 对 sqlite3session_delete() 的封装。

M

session[Symbol.dispose]

History
session[Symbol.dispose](): void

关闭会话。如果会话已关闭,则不执行任何操作。

类:StatementSync

History

此类表示单个 [预准备语句][]。此类不能 通过其构造函数实例化。相反,实例是通过 database.prepare() 方法创建的。此类暴露的所有 API 均执行 同步。

预准备语句是用于创建它的 SQL 的高效二进制表示。预准备语句是可参数化的, 并且可以使用不同的绑定值多次调用。参数还提供针对 SQL 注入 攻击的保护。出于这些原因,在处理用户输入时,预准备语句优于 手工编写的 SQL 字符串。

statement.all(namedParameters?, ...anonymousParameters?): void
Attributes
namedParameters:<Object>
一个用于绑定命名参数的可选对象。 此对象的键用于配置映射。
...anonymousParameters:<null> | <number> | <bigint> | <string> | <TypedArray> | <DataView>
零或 多个绑定到匿名参数的值。
返回值: <Array> 对象数组。每个对象对应于执行预准备语句返回的一行 数据。每个对象的键和值对应于行的列名和值。

此方法执行预准备语句并将所有结果作为对象数组返回。如果预准备语句 不返回任何结果,此方法返回一个空数组。预准备语句 [参数被绑定][] 使用 namedParametersanonymousParameters 中的值。

M

statement.columns

History
statement.columns(): void

此方法用于检索有关预准备语句返回的列的信息。

P

statement.expandedSQL

History
  • 类型:<string> 扩展为包含参数值的源 SQL。

预准备语句的源 SQL 文本,其中参数 占位符已被此预准备语句最近一次执行期间使用的值替换。此属性是 对 sqlite3_expanded_sql() 的封装。

statement.get(namedParameters?, ...anonymousParameters?): void
Attributes
namedParameters:<Object>
一个用于绑定命名参数的可选对象。 此对象的键用于配置映射。
...anonymousParameters:<null> | <number> | <bigint> | <string> | <TypedArray> | <DataView>
零或 多个绑定到匿名参数的值。
返回值: <Object> | <undefined> 对应于执行预准备语句返回的第一行的对象。 对象的键和值对应于行的列名和值。如果数据库 未返回任何行,则此方法返回  undefined

此方法执行预准备语句并将第一个结果作为对象返回。如果预准备语句 不返回任何结果,此方法返回 undefined。预准备语句 [参数被绑定][] 使用 namedParametersanonymousParameters 中的值。

statement.iterate(namedParameters?, ...anonymousParameters?): void
Attributes
namedParameters:<Object>
一个用于绑定命名参数的可选对象。 此对象的键用于配置映射。
...anonymousParameters:<null> | <number> | <bigint> | <string> | <TypedArray> | <DataView>
零或 多个绑定到匿名参数的值。
返回值: <Iterator> 对象的可迭代迭代器。每个对象对应于执行预准备语句返回的一行 数据。每个对象的键和值对应于行的列名和值。

此方法执行预准备语句并返回对象的迭代器。如果预准备语句 不返回任何结果,此方法返回一个空迭代器。预准备语句 [参数被绑定][] 使用 namedParametersanonymousParameters 中的值。

statement.run(namedParameters?, ...anonymousParameters?): void
Attributes
namedParameters:<Object>
一个用于绑定命名参数的可选对象。 此对象的键用于配置映射。
...anonymousParameters:<null> | <number> | <bigint> | <string> | <TypedArray> | <DataView>
零或 多个绑定到匿名参数的值。
返回值: <Object>
changes:<number> | <bigint>
最近完成的  INSERTUPDATEDELETE 语句 修改、插入或删除的行数。此字段是数字或 BigInt ,取决于预准备语句 的配置。此属性是 sqlite3_changes64() 的结果。
lastInsertRowid:<number> | <bigint>
最近插入的 rowid。此 字段是数字或  BigInt ,取决于预准备语句的 配置。此属性是 sqlite3_last_insert_rowid() 的结果。

此方法执行预准备语句并返回一个总结结果变更的对象。预准备语句 [参数被绑定][] 使用 namedParametersanonymousParameters 中的值。

M

statement.setAllowBareNamedParameters

History
statement.setAllowBareNamedParameters(enabled): void
Attributes
enabled:<boolean>
启用或禁用对绑定命名参数 无前缀字符的支持。

SQLite 参数的名称以前缀字符开头。默认情况下, node:sqlite 要求绑定参数时存在此前缀字符。但是,除了美元 符号字符外,这些前缀字符在对象键中使用时也需要额外引号。

为了提高易用性,此方法也可用于允许裸命名参数, 即在 JavaScript 代码中不需要前缀字符。启用裸命名参数时有几个 注意事项需要注意:

  • SQL 中仍然需要前缀字符。
  • JavaScript 中仍然允许前缀字符。事实上,前缀名称 将具有稍好的绑定性能。
  • 在同一预准备语句中使用歧义的命名参数,例如 $k@k, 将导致异常,因为无法确定如何绑定 裸名称。
M

statement.setAllowUnknownNamedParameters

History
statement.setAllowUnknownNamedParameters(enabled): void
Attributes
enabled:<boolean>
启用或禁用对未知命名参数的支持。

默认情况下,如果在绑定参数时遇到未知名称,则 抛出异常。此方法允许忽略未知的命名参数。

M

statement.setReturnArrays

History
statement.setReturnArrays(enabled): void
Attributes
enabled:<boolean>
启用或禁用将查询结果作为数组返回。

启用时,all()get()iterate() 方法返回的查询结果将作为数组返回,而不是 对象。

M

statement.setReadBigInts

History
statement.setReadBigInts(enabled): void
Attributes
enabled:<boolean>
启用或禁用读取 数据库中的  INTEGER 字段时使用 BigInt

从数据库读取时,SQLite INTEGER 默认映射到 JavaScript 数字。但是,SQLite INTEGER 可以存储比 JavaScript 数字能够表示的值更大的值。在这种情况下,此方法可用于 使用 JavaScript BigInt 读取 INTEGER 数据。此方法对数据库写入操作 没有影响,其中数字和 BigInt 始终都受支持。

P

statement.sourceSQL

History
  • 类型:<string> 用于创建此预准备语句的源 SQL。

预准备语句的源 SQL 文本。此属性是 对 sqlite3_sql() 的封装。

类:SQLTagStore

History

此类表示一个用于存储预编译语句的单 LRU(最近最少使用)缓存。

此类的实例是通过 database.createTagStore() 方法创建的,而不是使用构造函数。该存储基于提供的 SQL 查询字符串缓存预编译语句。当再次看到相同的查询时,存储会检索缓存的语句并通过参数绑定安全地应用新值,从而防止 SQL 注入等攻击。

缓存有一个默认为 1000 条语句的 maxSize,但可以提供自定义大小(例如,database.createTagStore(100))。此类暴露的所有 API 均同步执行。

M

sqlTagStore.all

History
sqlTagStore.all(stringElements, ...boundParameters?): void
Attributes
stringElements:<string[]>
包含 SQL 查询的模板字面量元素。
要绑定到模板字符串中占位符的参数值。
返回: <Array> 一个对象数组,表示查询返回的行。

执行给定的 SQL 查询并将所有结果行作为对象数组返回。

此函数旨在用作模板字面量标签,而不是直接调用。

M

sqlTagStore.get

History
sqlTagStore.get(stringElements, ...boundParameters?): void
Attributes
stringElements:<string[]>
包含 SQL 查询的模板字面量元素。
要绑定到模板字符串中占位符的参数值。
返回: <Object> | <undefined> 一个对象,表示查询返回的第一行,如果没有返回行则为  undefined

执行给定的 SQL 查询并将第一行结果作为对象返回。

此函数旨在用作模板字面量标签,而不是直接调用。

M

sqlTagStore.iterate

History
sqlTagStore.iterate(stringElements, ...boundParameters?): void
Attributes
stringElements:<string[]>
包含 SQL 查询的模板字面量元素。
要绑定到模板字符串中占位符的参数值。
返回: <Iterator> 一个迭代器,生成表示查询返回的行的对象。

执行给定的 SQL 查询并返回结果行的迭代器。

此函数旨在用作模板字面量标签,而不是直接调用。

M

sqlTagStore.run

History
sqlTagStore.run(stringElements, ...boundParameters?): void
Attributes
stringElements:<string[]>
包含 SQL 查询的模板字面量元素。
要绑定到模板字符串中占位符的参数值。
返回: <Object> 一个包含执行信息的对象,包括  changeslastInsertRowid

执行给定的 SQL 查询,预期不返回任何行(例如,INSERT、UPDATE、DELETE)。

此函数旨在用作模板字面量标签,而不是直接调用。

一个只读属性,返回缓存中当前预编译语句的数量。

P

sqlTagStore.capacity

History

一个只读属性,返回缓存可以容纳的最大预编译语句数量。

P

sqlTagStore.db

History
  • 类型:{DatabaseSync}

一个只读属性,返回与此 SQLTagStore 关联的 DatabaseSync 对象。

M

sqlTagStore.clear

History
sqlTagStore.clear(): void

重置 LRU 缓存,清除所有存储的预编译语句。

M

sqlite.backup

History
sqlite.backup(sourceDb, path, options?): void
  • sourceDb {DatabaseSync} 要备份的数据库。源数据库必须处于打开状态。
  • path <string> | <URL> 创建备份的路径。如果文件已存在,内容将被覆盖。
  • options <Object> 备份的可选配置。支持以下属性:
    Attributes
    source:<string>
    源数据库的名称。可以是  'main' (默认主数据库)或任何已通过 ATTACH DATABASE 添加的其他数据库 默认值: 'main'
    target:<string>
    目标数据库的名称。可以是  'main' (默认主数据库)或任何已通过 ATTACH DATABASE 添加的其他数据库 默认值: 'main'
    每批备份中传输的页数。  默认值: 100
    progress:<Function>
    一个可选的回调函数,将在每个备份步骤后调用。传递给此回调的参数是一个 <Object> ,具有  remainingPagestotalPages 属性,描述备份操作的当前进度。
  • 返回:<Promise> 一个 Promise,完成时 fulfilled 值为备份的总页数,如果发生错误则 rejected。

此方法进行数据库备份。此方法抽象了 sqlite3_backup_init()sqlite3_backup_step()sqlite3_backup_finish() 函数。

备份的数据库在备份过程中可以正常使用。来自同一连接(同一 {DatabaseSync} 对象)的变更会立即反映在备份中。但是,来自其他连接的变更会导致备份过程重新启动。

const { backup, DatabaseSync } = require('node:sqlite');

(async () => {
  const sourceDb = new DatabaseSync('source.db');
  const totalPagesTransferred = await backup(sourceDb, 'backup.db', {
    rate: 1, // 一次复制一页。
    progress: ({ totalPages, remainingPages }) => {
      console.log('Backup in progress', { totalPages, remainingPages });
    },
  });

  console.log('Backup completed', totalPagesTransferred);
})();
P

sqlite.constants

History

一个包含 SQLite 操作常用常量的对象。

以下常量由 sqlite.constants 对象导出。

以下常量之一可作为传递给 database.applyChangeset()onConflict 冲突解决处理程序的参数。另请参阅 SQLite 文档中的 传递给冲突处理程序的常量

常量 描述
SQLITE_CHANGESET_DATA 当处理 DELETE 或 UPDATE 变更时,如果数据库中存在具有所需主键字段的行,但更新修改的一个或多个其他(非主键)字段不包含预期的“之前”值,则使用此常量调用冲突处理程序。
SQLITE_CHANGESET_NOTFOUND 当处理 DELETE 或 UPDATE 变更时,如果数据库中不存在具有所需主键字段的行,则使用此常量调用冲突处理程序。
SQLITE_CHANGESET_CONFLICT 在处理 INSERT 变更时,如果操作会导致主键值重复,则将此常量传递给冲突处理程序。
SQLITE_CHANGESET_CONSTRAINT 如果启用了外键处理,并且应用变更集使数据库处于包含外键违规的状态,则在提交变更集之前恰好一次使用此常量调用冲突处理程序。如果冲突处理程序返回 SQLITE_CHANGESET_OMIT,则提交更改,包括导致外键约束违规的更改。或者,如果它返回 SQLITE_CHANGESET_ABORT,则回滚变更集。
SQLITE_CHANGESET_FOREIGN_KEY 如果在应用变更时发生任何其他约束违规(即 UNIQUE、CHECK 或 NOT NULL 约束),则使用此常量调用冲突处理程序。

以下常量之一必须从传递给 database.applyChangeset()onConflict 冲突解决处理程序返回。另请参阅 SQLite 文档中的 从冲突处理程序返回的常量

常量 描述
SQLITE_CHANGESET_OMIT 省略冲突的更改。
SQLITE_CHANGESET_REPLACE 冲突的更改替换现有值。请注意,仅当冲突类型为 SQLITE_CHANGESET_DATASQLITE_CHANGESET_CONFLICT 时,才能返回此值。
SQLITE_CHANGESET_ABORT 当更改遇到冲突时中止并回滚数据库。

以下常量与 database.setAuthorizer() 方法一起使用。

以下常量之一必须从传递给 database.setAuthorizer() 的授权回调函数返回。

常量 描述
SQLITE_OK 允许操作正常进行。
SQLITE_DENY 拒绝操作并导致返回错误。
SQLITE_IGNORE 忽略操作并继续,就好像从未请求过它一样。

以下常量作为第一个参数传递给授权回调函数,以指示正在授权的操作类型。

常量 描述
SQLITE_CREATE_INDEX 创建索引
SQLITE_CREATE_TABLE 创建表
SQLITE_CREATE_TEMP_INDEX 创建临时索引
SQLITE_CREATE_TEMP_TABLE 创建临时表
SQLITE_CREATE_TEMP_TRIGGER 创建临时触发器
SQLITE_CREATE_TEMP_VIEW 创建临时视图
SQLITE_CREATE_TRIGGER 创建触发器
SQLITE_CREATE_VIEW 创建视图
SQLITE_DELETE 从表中删除
SQLITE_DROP_INDEX 删除索引
SQLITE_DROP_TABLE 删除表
SQLITE_DROP_TEMP_INDEX 删除临时索引
SQLITE_DROP_TEMP_TABLE 删除临时表
SQLITE_DROP_TEMP_TRIGGER 删除临时触发器
SQLITE_DROP_TEMP_VIEW 删除临时视图
SQLITE_DROP_TRIGGER 删除触发器
SQLITE_DROP_VIEW 删除视图
SQLITE_INSERT 插入到表中
SQLITE_PRAGMA 执行 PRAGMA 语句
SQLITE_READ 从表中读取
SQLITE_SELECT 执行 SELECT 语句
SQLITE_TRANSACTION 开始、提交或回滚事务
SQLITE_UPDATE 更新表
SQLITE_ATTACH 附加数据库
SQLITE_DETACH 分离数据库
SQLITE_ALTER_TABLE 修改表
SQLITE_REINDEX 重新索引
SQLITE_ANALYZE 分析数据库
SQLITE_CREATE_VTABLE 创建虚拟表
SQLITE_DROP_VTABLE 删除虚拟表
SQLITE_FUNCTION 使用函数
SQLITE_SAVEPOINT 创建、释放或回滚保存点
SQLITE_COPY 复制数据(旧版)
SQLITE_RECURSIVE 递归查询