Skip to content

Files

Latest commit

 

History

History
302 lines (211 loc) · 13.4 KB

记录.md

File metadata and controls

302 lines (211 loc) · 13.4 KB

对于coSqlite3.js

function coSqlite3(opt,logger) line 16-38

这部分代码定义了一个构造函数 coSqlite3(opt, logger),用于创建 SQLite 数据库连接。以下是代码的解释:

  • 这个函数接受两个参数:optlogger
  • opt 是一个配置对象,用于指定数据库的文件名和模式。
  • logger 是一个可选的日志记录器,用于替代默认的 console

在函数内部:

  1. 首先,它检查是否已经存在数据库连接 db,如果不存在,就会创建一个新的连接。
  2. 如果传递了 logger 参数,它会将全局变量 LOG 设置为传递的 logger
  3. 如果没有传递 opt 参数,它会创建一个空的配置对象 {}
  4. 然后,它使用 sqlite3.Database 构造函数创建数据库连接,传递了文件名和模式作为参数。如果 opt.file 未指定,则默认为 :memory:(内存中的数据库)。模式默认为 (sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE),表示读写并且在数据库不存在时创建新的数据库。
  5. 如果数据库连接出现错误,它会记录错误信息,否则,它会执行 SQL 语句 PRAGMA foreign_keys=ON; 来启用外键约束,并记录一条信息表示数据库已准备就绪。
  6. 最后,函数返回自身 coSqlite3,这意味着你可以通过调用 coSqlite3(opt, logger) 来获取数据库连接对象。
  7. 还定义了一些常量 coSqlite3.OPEN_READONLYcoSqlite3.OPEN_READWRITEcoSqlite3.OPEN_CREATE,这些常量用于表示数据库的不同模式。这些常量与 SQLite 库中的相应常量相同。

要使用这个构造函数创建数据库连接,你可以按照以下方式调用:

const coSqlite3 = require('./coSqlite3'); // 导入模块

const database = new coSqlite3({
  file: 'mydatabase.db', // 指定数据库文件名
  mode: coSqlite3.OPEN_READWRITE | coSqlite3.OPEN_CREATE // 指定数据库模式
}, myLogger); // myLogger 是一个可选的自定义日志记录器

// 现在你可以使用 database 对象进行数据库操作

上方说到的几种数据库的模式:

  1. sqlite3.OPEN_READONLY
    • 这个模式表示数据库连接以只读模式打开。
    • 只读模式允许执行查询操作,但不允许对数据库进行写入或修改操作。
    • 适用于只需要查询数据库而不需要修改数据的情况。
  2. sqlite3.OPEN_READWRITE
    • 这个模式表示数据库连接以读写模式打开。
    • 读写模式允许执行查询操作和修改数据库中的数据。
    • 适用于需要读取和修改数据库数据的情况。
  3. sqlite3.OPEN_CREATE
    • 这个模式表示如果指定的数据库文件不存在,则会创建一个新的数据库文件。
    • 如果数据库文件已经存在,它将以读写模式打开。
    • 这个模式允许在数据库文件不存在时创建数据库,并允许执行查询和修改操作。

通常,你可以使用这些模式的组合来满足你的需求,例如:

  • 如果只需要查询数据库,可以使用 sqlite3.OPEN_READONLY 模式。
  • 如果需要读取和修改数据库数据,可以使用 sqlite3.OPEN_READWRITE 模式。
  • 如果需要创建新数据库文件并执行读写操作,可以使用 sqlite3.OPEN_CREATE 模式的组合。

这些模式允许你在数据库连接时指定所需的权限和行为,以便安全地执行相应的数据库操作。

coSqlite3.SingleSQL=function(sql,silent) line 47-64

用于执行单个 SQL 查询,并返回一个 Promise。以下是该函数的详细解释:

  • SingleSQL 函数的参数:
    • sql:可以是一个字符串表示的 SQL 查询,也可以是一个包含两个属性的对象,即 sqlargs,其中 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=function * (sqls,other)

  1. 这段代码定义了一个名为 coSqlite3.execSQL 的函数,用于执行多个 SQL 查询,并支持事务操作。以下是函数的详细解释:

    • coSqlite3.execSQL(sqls, other):

      • 这个函数用于执行多个 SQL 查询,并支持事务操作。

      • sqls 参数可以是一个字符串形式的 SQL 查询,也可以是一个包含多个对象的数组,每个对象包含 sqlargs 属性,分别表示 SQL 查询字符串和参数数组。

      • other
        

        参数是一个可选参数,可以包含以下属性:

        • args:一个参数数组,用于替代 sqls 中的参数。
        • autoTrans:一个布尔值,指示是否在执行查询时使用事务,默认为 true
        • Error:一个特殊标记,用于表示在发生错误时返回错误对象而不是抛出异常。
      • 函数返回一个 Promise 对象,解析的结果是最后一个 SQL 查询的结果。

函数的执行流程如下:

  1. 首先,函数会智能解析传入的参数,根据参数的类型来确定 argsautoTransconnretError 变量的值。
  2. 如果 sqls 参数是字符串类型,函数会将其转换为包含一个对象的数组,该对象具有 sql 和空数组 args
  3. 如果启用了事务 (autoTranstrue),函数会执行 coSqlite3.SingleSQL('begin;') 来开始一个事务。
  4. 然后,函数会迭代执行传入的 SQL 查询,每个查询都通过 coSqlite3.SingleSQL 来执行,并将结果赋给 rows 变量。
  5. 如果在执行查询的过程中出现错误,函数会回滚事务(如果启用了事务),并根据 retError 的值来返回错误对象或抛出异常。
  6. 最后,如果启用了事务,函数会执行 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();

coSqlite3.wrapRowData=function(row)

用于将查询结果的一行数据转换为 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=function(body,map,arg,withSet)

这是 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=function(body,map,arg,withWhere)

这是 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 子句,根据请求的条件来过滤数据库表的内容,并自动处理参数值的生成。