这部分代码定义了一个构造函数 coSqlite3(opt, logger)
,用于创建 SQLite 数据库连接。以下是代码的解释:
- 这个函数接受两个参数:
opt
和logger
。 opt
是一个配置对象,用于指定数据库的文件名和模式。logger
是一个可选的日志记录器,用于替代默认的console
。
在函数内部:
- 首先,它检查是否已经存在数据库连接
db
,如果不存在,就会创建一个新的连接。 - 如果传递了
logger
参数,它会将全局变量LOG
设置为传递的logger
。 - 如果没有传递
opt
参数,它会创建一个空的配置对象{}
。 - 然后,它使用
sqlite3.Database
构造函数创建数据库连接,传递了文件名和模式作为参数。如果opt.file
未指定,则默认为:memory:
(内存中的数据库)。模式默认为(sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE)
,表示读写并且在数据库不存在时创建新的数据库。 - 如果数据库连接出现错误,它会记录错误信息,否则,它会执行 SQL 语句
PRAGMA foreign_keys=ON;
来启用外键约束,并记录一条信息表示数据库已准备就绪。 - 最后,函数返回自身
coSqlite3
,这意味着你可以通过调用coSqlite3(opt, logger)
来获取数据库连接对象。 - 还定义了一些常量
coSqlite3.OPEN_READONLY
、coSqlite3.OPEN_READWRITE
和coSqlite3.OPEN_CREATE
,这些常量用于表示数据库的不同模式。这些常量与 SQLite 库中的相应常量相同。
要使用这个构造函数创建数据库连接,你可以按照以下方式调用:
const coSqlite3 = require('./coSqlite3'); // 导入模块
const database = new coSqlite3({
file: 'mydatabase.db', // 指定数据库文件名
mode: coSqlite3.OPEN_READWRITE | coSqlite3.OPEN_CREATE // 指定数据库模式
}, myLogger); // myLogger 是一个可选的自定义日志记录器
// 现在你可以使用 database 对象进行数据库操作
上方说到的几种数据库的模式:
sqlite3.OPEN_READONLY
:- 这个模式表示数据库连接以只读模式打开。
- 只读模式允许执行查询操作,但不允许对数据库进行写入或修改操作。
- 适用于只需要查询数据库而不需要修改数据的情况。
sqlite3.OPEN_READWRITE
:- 这个模式表示数据库连接以读写模式打开。
- 读写模式允许执行查询操作和修改数据库中的数据。
- 适用于需要读取和修改数据库数据的情况。
sqlite3.OPEN_CREATE
:- 这个模式表示如果指定的数据库文件不存在,则会创建一个新的数据库文件。
- 如果数据库文件已经存在,它将以读写模式打开。
- 这个模式允许在数据库文件不存在时创建数据库,并允许执行查询和修改操作。
通常,你可以使用这些模式的组合来满足你的需求,例如:
- 如果只需要查询数据库,可以使用
sqlite3.OPEN_READONLY
模式。 - 如果需要读取和修改数据库数据,可以使用
sqlite3.OPEN_READWRITE
模式。 - 如果需要创建新数据库文件并执行读写操作,可以使用
sqlite3.OPEN_CREATE
模式的组合。
这些模式允许你在数据库连接时指定所需的权限和行为,以便安全地执行相应的数据库操作。
用于执行单个 SQL 查询,并返回一个 Promise。以下是该函数的详细解释:
SingleSQL
函数的参数:sql
:可以是一个字符串表示的 SQL 查询,也可以是一个包含两个属性的对象,即sql
和args
,其中sql
是 SQL 查询字符串,args
是一个参数数组。silent
:一个布尔值,表示是否在发生 SQL 错误时静默处理(不打印错误日志)。
SingleSQL
函数的行为:- 如果
sql
参数的类型是字符串(String
),它会将其转换为一个具有sql
和空数组args
的对象,以便后续使用。 - 然后,函数返回一个 Promise 对象,该 Promise 用于处理 SQL 查询的结果。
- 在 Promise 内部,它使用数据库连接对象
db
执行 SQL 查询,通过调用db.all(sql.sql, sql.args, callback)
方法。 - 如果查询执行出现错误,它会拒绝 Promise,打印错误信息,并将错误对象传递给
reject
函数。 - 如果查询成功执行,它会解析查询结果的行,并通过
resolve
函数将结果传递给 Promise,允许在 Promise 链中进一步处理结果。
- 如果
这个函数的主要作用是执行单个 SQL 查询,并将结果包装在一个 Promise 中,以便你可以使用异步的方式来处理查询结果。在使用时,你可以调用 SingleSQL
函数,传入你的 SQL 查询,并使用 .then()
和 .catch()
方法来处理成功和失败的情况。例如:
coSqlite3.SingleSQL('SELECT * FROM my_table', false)
.then(result => {
console.log(result); // 处理查询结果
})
.catch(error => {
console.error(error); // 处理错误
});
这将执行查询并在查询完成时触发 .then()
或 .catch()
回调函数,具体取决于查询的成功与否。
-
这段代码定义了一个名为
coSqlite3.execSQL
的函数,用于执行多个 SQL 查询,并支持事务操作。以下是函数的详细解释:-
coSqlite3.execSQL(sqls, other)
:-
这个函数用于执行多个 SQL 查询,并支持事务操作。
-
sqls
参数可以是一个字符串形式的 SQL 查询,也可以是一个包含多个对象的数组,每个对象包含sql
和args
属性,分别表示 SQL 查询字符串和参数数组。 -
other
参数是一个可选参数,可以包含以下属性:
args
:一个参数数组,用于替代sqls
中的参数。autoTrans
:一个布尔值,指示是否在执行查询时使用事务,默认为true
。Error
:一个特殊标记,用于表示在发生错误时返回错误对象而不是抛出异常。
-
函数返回一个 Promise 对象,解析的结果是最后一个 SQL 查询的结果。
-
-
函数的执行流程如下:
- 首先,函数会智能解析传入的参数,根据参数的类型来确定
args
、autoTrans
、conn
和retError
变量的值。 - 如果
sqls
参数是字符串类型,函数会将其转换为包含一个对象的数组,该对象具有sql
和空数组args
。 - 如果启用了事务 (
autoTrans
为true
),函数会执行coSqlite3.SingleSQL('begin;')
来开始一个事务。 - 然后,函数会迭代执行传入的 SQL 查询,每个查询都通过
coSqlite3.SingleSQL
来执行,并将结果赋给rows
变量。 - 如果在执行查询的过程中出现错误,函数会回滚事务(如果启用了事务),并根据
retError
的值来返回错误对象或抛出异常。 - 最后,如果启用了事务,函数会执行
coSqlite3.SingleSQL('commit;')
来提交事务,然后返回查询结果。
这个函数的主要用途是批量执行多个 SQL 查询,并支持事务,确保查询操作的一致性。你可以使用该函数来执行一系列的数据库操作,并根据需要启用或禁用事务,以确保数据的完整性。
const coSqlite3 = require('./coSqlite3'); // 导入模块
async function example() {
// 创建数据库连接
const db = new coSqlite3({
file: 'mydatabase.db',
mode: coSqlite3.OPEN_READWRITE | coSqlite3.OPEN_CREATE
});
try {
// 定义要执行的 SQL 查询
const insertQuery = 'INSERT INTO my_table (ID, NAME) VALUES (?, ?)';
const selectQuery = 'SELECT * FROM my_table';
// 使用 coSqlite3.execSQL 执行多个查询
const result = await coSqlite3.execSQL(
[
{ sql: insertQuery, args: [1, 'Alice'] }, // 插入数据
{ sql: selectQuery }, // 查询数据
],
{
autoTrans: true, // 启用事务
args: [], // 参数数组,用于替代 SQL 查询中的参数
}
);
console.log('Result of the last query:');
console.log(result);
} catch (error) {
console.error('Error:', error);
} finally {
// 关闭数据库连接
db.close();
}
}
example();
用于将查询结果的一行数据转换为 JSON 对象。以下是该函数的详细解释和使用示例:
coSqlite3.wrapRowData(row)
- 这个函数用于将查询结果的一行数据转换为 JSON 对象。
- 它接受一个参数
row
,表示查询结果的一行数据。 - 函数会迭代遍历行数据的属性,并将其复制到一个新的 JSON 对象中,然后返回这个 JSON 对象。
使用示例:
假设你有一个查询结果的行数据如下:
const row = { ID: 1, NAME: 'John', AGE: 30 };
你可以使用 coSqlite3.wrapRowData(row)
来将它转换为 JSON 对象:
const jsonRow = coSqlite3.wrapRowData(row);
// 结果为 { ID: 1, NAME: 'John', AGE: 30 }
这个函数非常有用,当你需要将查询结果的行数据以 JSON 格式返回时,可以使用它来轻松地将查询结果转换为更容易处理的 JSON 对象。
例如,你可以在数据库查询操作中使用它,将查询结果的行数据转换为 JSON 格式,然后将其用于进一步的数据处理或API响应。这可以帮助你更方便地操作和传递查询结果。
这是 coSqlite3
模块中的一个函数 wrapSet
,用于生成 SQL 更新语句的 SET 子句字符串和参数数组。以下是该函数的详细解释和使用示例:
-
coSqlite3.wrapSet(body, map, arg, withSet)
:
- 这个函数用于构建 SQL 更新语句的 SET 子句字符串,以及生成与 SET 子句相关的参数数组。
- 它接受四个参数:
body
:一个包含 POST 数据或 GET 数据的 JSON 对象,表示要更新的数据。map
:一个映射对象,其中键是body
对象的属性,值是数据表字段的名称,用于将请求数据映射到数据库表。arg
:一个空数组,用于接收生成的参数值。withSet
:一个布尔值,指示是否在生成 SET 子句时包括 "set" 关键字。如果为true
,则包括 "set",否则只生成 SET 子句中的列和值。
使用示例:
假设你有以下参数和映射:
const body = {
ID: 1,
NAME: 'Alice',
AGE: 25
};
const map = {
ID: 'sid',
NAME: 'xName',
AGE: 'xAge'
};
你可以使用 coSqlite3.wrapSet
函数来生成 SQL 更新语句的 SET 子句和参数数组:
const arg = []; // 用于接收参数的数组
const setClause = coSqlite3.wrapSet(body, map, arg, true); // 生成 SET 子句
console.log(setClause); // 输出: "set sid=?,xName=?,xAge=?"
console.log(arg); // 输出: [1, 'Alice', 25]
在这个示例中,函数将 body
中的属性映射到数据库表中的字段,并生成了 SET 子句字符串以及相应的参数数组。你可以将生成的 SET 子句用于 SQL 更新语句,以更新数据库中的记录。
这个函数非常有用,因为它可以帮助你动态生成 SQL 更新语句,根据请求的数据来更新数据库表的内容,而且可以自动处理参数值的生成。
这是 coSqlite3
模块中的一个函数 wrapWhere
,用于生成 SQL 查询语句的 WHERE 子句字符串和参数数组。以下是该函数的详细解释和使用示例:
-
coSqlite3.wrapWhere(body, map, arg, withWhere)
- 这个函数用于构建 SQL 查询语句的 WHERE 子句字符串,以及生成与 WHERE 子句相关的参数数组。
- 它接受四个参数:
body
:一个包含 POST 数据或 GET 数据的 JSON 对象,表示查询条件。map
:一个映射对象,其中键是body
对象的属性,值是用于数据库表字段的名称,用于将请求数据映射到数据库表。arg
:一个空数组,用于接收生成的参数值。withWhere
:一个布尔值,指示是否在生成 WHERE 子句时包括 "where" 关键字。如果为true
,则包括 "where",否则只生成 WHERE 子句中的条件。
使用示例:
假设你有以下参数和映射:
const body = {
ID: 1,
NAME: 'Alice',
AGE: 25
};
const map = {
ID: ['sid', '='],
NAME: ['xName', 'like'],
AGE: ['xAge', '>']
};
你可以使用 coSqlite3.wrapWhere
函数来生成 SQL 查询语句的 WHERE 子句和参数数组:
const arg = []; // 用于接收参数的数组
const whereClause = coSqlite3.wrapWhere(body, map, arg, true); // 生成 WHERE 子句
console.log(whereClause); // 输出: "where sid=? and xName like ? and xAge > ?"
console.log(arg); // 输出: [1, '%Alice%', 25]
输出的sql语句:
where sid=? and xName like ? and xAge > ?
在这个示例中,函数将 body
中的属性映射到数据库表中的字段,并生成了 WHERE 子句字符串以及相应的参数数组。你可以将生成的 WHERE 子句用于 SQL 查询语句,以筛选符合条件的数据库记录。
这个函数非常有用,因为它可以帮助你动态生成 SQL 查询语句的 WHERE 子句,根据请求的条件来过滤数据库表的内容,并自动处理参数值的生成。