database.run("CREATE TABLE foo (id INT)", function(e){ if(e !== null){ throw e; } //循环生成sql语句,批次插入多条数据 var sql = ""; for(var i = 0 ; i < 500; i ++){ sql += 'INSERT INTO foo VALUES(' + i + ');' } database.exec(sql, done) });
查询一条数据
Database#get(sql, [param, ...], [callback])
sql:要运行的SQL字符串。sql的类型是DQL。这里仅返回第一条查询到的数据。
param,...(可选):同Database#run的param参数
callback(可选):同样是返回null代表执行成功。回调的签名是function(err,row)。如果查询结果集为空,则第二个参数为undefined;否则第二个参数值是查询到的第一个对象,他是个json对象,属性名称对应于结果集的列名称,因此查询的每一列都应该给出一个列表名。
查询所有数据
Database#all(sql, [param, ...], [callback])
sql:要运行的SQL字符串。sql的类型是DQL。和Database#get不同,Database#all会返回所有查询到的语句。
param,...(可选):同Database#run的param参数
callback(可选):同样是返回null代表执行成功。回调的签名是function(err, rows) 。rows是一个数组,如果查询结果集为空数组。
! 注意,Database#all首先检索所有结果行并将其存储在内存中。 对于数据量可能很大的查询命令时候,请使用Database#each函数或Database#prepare代替这个方法。
遍历数据
Database#each(sql, [param, ...], [callback], [complete])
与Database#run函数相同,都是查询多条数据,但是具有以下区别:
回调的签名是function(err,row)。如果结果集成功但为空,则不会调用回调。对于每个检索到的行,该方法都会调用一次回调。执行顺序与结果集中的行顺序完全对应。
调用所有行回调后,如果存在complete回调函数,将调用这个回调。第一个参数是一个错误对象,第二个参数是检索行数。
语句执行顺序
sqlite3的API都是异步的,这就会出现可能有若干个命令同时进行的情况,因此sqlite3提供了两个函数来帮助控制语句的执行流程。默认是并行模式。
序列化执行
Database#serialize([callback])
如果提供回调,它将立即被调用,即此方法的回调不是异步回调。在该回调中调度的所有数据库语句将被序列化运行,即一个接一个地执行。 函数返回后,数据库将再次设置为其原始模式。
// 这里执行的命令是并行的 db.serialize(function() { // 这里执行的命令是串行的 db.serialize(function() { // 这里执行的命令是串行的 }); // 这里执行的命令是串行的 }); // 这里执行的命令是并行的
并行执行模式
Database#parallelize([callback])
如果提供回调,它将立即被调用,即此方法的回调不是异步回调。在该回调中调度的所有数据库语句将并行运行。函数返回后,数据库将再次设置为其原始模式。
db.serialize(function() { // 这里执行的命令是串行的 db.parallelize(function() { // 这里执行的命令是并行的 }); // 这里执行的命令是串行的 });
预编译SQL相关api
在java的jdbc中,有个PreparedStatement相关的api,可以预编译sql语句,执行的时候再链接具体参数。这样的好处是可以减少sql语句被编译的次数。在sqlite3中,也存在实现这样功能的api。
Database#prepare(sql, [param, ...], [callback])
Database#prepare执行后,会返回一个命令对象,这个命令对象可以反复执行。下面看看这个命令对象(statement )的api:
Statement#run([param, ...], [callback]) Statement#get([param, ...], [callback]) Statement#all([param, ...], [callback]) Statement#each([param, ...], [callback])
以上api方法与Database的同名方法调用方式相同。不同点是这里的Statement对象是可以复用的,避免了重复编译sql语句,因此项目中更推荐使用上述方法。
! 注意,这些方法的param参数都会对Statement对象绑定参数,在下一次执行的时候,如果没有重新绑定参数,是会使用上一次参数的。
绑定参数
Statement#bind([param, ...], [callback])
Database#prepare执行的时候,是可以绑定参数的。不过使用此方法可以全重置语句对象和行游标,并删除所有先前绑定的参数,实现重新绑定的功能。
重置语句的行游标
Statement#reset([callback])
重置语句的行游标,并保留参数绑定。使用此功能可以使用相同的绑定重新执行相同的查询。
数据库事务