亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

nodejs集成sqlite使用示例

 更新時(shí)間:2017年06月05日 08:29:45   作者:laden666666  
本篇文章主要介紹了nodejs集成sqlite使用示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

正在物色node上面的輕量級(jí)嵌入式數(shù)據(jù)庫(kù),作為嵌入式數(shù)據(jù)庫(kù)的代表,sqlite無疑是個(gè)理想的選擇方案。npm上集成sqlite的庫(kù)主要有兩個(gè)——sqlite3和realm。

realm是一個(gè)理想的選擇方案,它最初是為移動(dòng)app設(shè)計(jì)的,在node也可以運(yùn)行的,但是不支持Windows系統(tǒng)。sqlite3是一個(gè)專為nodejs設(shè)計(jì)的,在nodejs上面生態(tài)更健壯,因此最終選擇sqlite3。

sqlite3幾乎支持所有版本的nodejs,同時(shí)也可以和nwjs集成。

安裝

基于npm安裝

npm install sqlite3

這樣除了安裝完sqlite3的npm包,最主要的是也裝完了sqlite數(shù)據(jù)庫(kù),因?yàn)閟qlite是嵌入式數(shù)據(jù)庫(kù),嵌入到客戶端中。sqlite3使用node-pre-gyp為各個(gè)平臺(tái)下載指定的預(yù)編譯的二進(jìn)制文件。如果無法下載到預(yù)編譯的二進(jìn)制文件,sqlite3將使用node-gyp和源代碼來構(gòu)建擴(kuò)展。

這個(gè)過程出現(xiàn)兩個(gè)的庫(kù)——node-pre-gyp和node-gyp。他們究竟是什么呢?

node-gyp是一個(gè)跨平臺(tái)的命令行工具,用于編譯C++編寫的nodejs擴(kuò)展,首先gyp是為Chromium項(xiàng)目創(chuàng)建的項(xiàng)目生成工具,可以從平臺(tái)無關(guān)的配置生成平臺(tái)相關(guān)的Visual Studio、Xcode、Makefile的項(xiàng)目文件,node-gyp就是將其集成到nodejs中。因?yàn)閘inux的二進(jìn)制分發(fā)快平臺(tái)做的并不好,所有npm為了方便干脆就直接源碼分發(fā),用戶裝的時(shí)候再現(xiàn)場(chǎng)編譯。不過對(duì)有些項(xiàng)目二進(jìn)制分發(fā)就比源碼分發(fā)簡(jiǎn)單多了,所以還有個(gè)node-pre-gyp來直接二進(jìn)制擴(kuò)展的分發(fā)。

兩者區(qū)別在于node-gyp是發(fā)布擴(kuò)展的源碼,然后安裝時(shí)候編譯;node-pre-gyp是直接發(fā)布編譯后的二級(jí)制形式的擴(kuò)展。

和sqlite3一樣的需要基于node-gyp安裝的npm模塊也有很多,比如node-sass等,都是發(fā)布源代碼,然后編譯安裝。

基礎(chǔ)api 

sqlite3的api都是基于函數(shù)回調(diào)的,因?yàn)閚odejs中沒有像java的jdbc那種官方的數(shù)據(jù)庫(kù)客戶端接口,因此每個(gè)數(shù)據(jù)庫(kù)的api都不一樣,這里簡(jiǎn)單介紹幾個(gè)sqlite3重要的api。

新建并打開數(shù)據(jù)庫(kù)

new sqlite3.Database(filename, [mode], [callback])

該方法返回一個(gè)自動(dòng)打開的數(shù)據(jù)庫(kù)對(duì)象,參數(shù):

filename:有效值是一個(gè)文件名,如:“mydatebase.db”,數(shù)據(jù)庫(kù)打開之后會(huì)創(chuàng)建一個(gè)“mydatebase.db”的文件用于保存數(shù)據(jù)。如果文件名是“:memory:”,表示是一個(gè)內(nèi)存數(shù)據(jù)庫(kù)(類似h2那種),數(shù)據(jù)不會(huì)持久化保存,當(dāng)關(guān)閉數(shù)據(jù)庫(kù)時(shí),內(nèi)容將丟失。

mode(可選):數(shù)據(jù)庫(kù)的模式,共3種值:sqlite3.OPEN_READONLY(只讀),sqlite3.OPEN_READWRITE(可讀寫)和sqlite3.OPEN_CREATE(可以創(chuàng)建)。 默認(rèn)值為OPEN_READWRITE |OPEN_CREATE。

callback(可選):則當(dāng)數(shù)據(jù)庫(kù)成功打開或發(fā)生錯(cuò)誤時(shí),將調(diào)用此函數(shù)。 第一個(gè)參數(shù)是一個(gè)錯(cuò)誤對(duì)象,當(dāng)它為空時(shí),表示打開成功。

打開一個(gè)數(shù)據(jù)庫(kù),如:

//數(shù)據(jù)庫(kù)的名字是"mydatebase.db"
var database;
database = new sqlite3.Database("mydatebase.db", function(e){
 if (err) throw err;
});
//也可以使用內(nèi)存型,數(shù)據(jù)不會(huì)永久保存
database = new sqlite3.Database(":memory:", function(e){
 if (err) throw err;
});

執(zhí)行后會(huì)在項(xiàng)目的根目錄生成一個(gè)“mydatebase.db”文件,這就是sqlite保存數(shù)據(jù)的文件了。

關(guān)閉數(shù)據(jù)庫(kù)

Database#close([callback])

該方法可以關(guān)閉一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象,參數(shù):

callback(可選):關(guān)閉成功的回調(diào)。 第一個(gè)參數(shù)是一個(gè)錯(cuò)誤對(duì)象,當(dāng)它為“null”時(shí),表示關(guān)閉成功。

執(zhí)行DDL和DML語(yǔ)句 

Database#run(sql, [param, ...], [callback])

該方法可以執(zhí)行DDL和DML語(yǔ)句,如建表、刪除表、刪除行數(shù)據(jù)、插入行數(shù)據(jù)等,參數(shù):

sql:要運(yùn)行的SQL字符串。sql的類型是DDL和DML,DQL不能使用這個(gè)命令。執(zhí)行后返回值不包含任何結(jié)果,必須通過callback回調(diào)函數(shù)獲取執(zhí)行結(jié)果。

param,...(可選):當(dāng)SQL語(yǔ)句包含占位符(?)時(shí),這里可以傳對(duì)應(yīng)的參數(shù)。 這里有三種傳值方法,如:

// 直接通過參數(shù)傳值.
db.run("UPDATE tbl SET name = ? WHERE id = ?", "bar", 2);



// 將值封裝為一個(gè)數(shù)組傳值.
db.run("UPDATE tbl SET name = ? WHERE id = ?", [ "bar", 2 ]);



// 使用一個(gè)json傳值.參數(shù)的前綴可以是“:name”,“@name”和“$name”。推薦用“$name”形式
db.run("UPDATE tbl SET name = $name WHERE id = $id", {
 $id: 2,
 $name: "bar"
});

關(guān)于占位符的命名,sqlite3還支持更復(fù)雜的形式,這里不再擴(kuò)展,有興趣了解的話請(qǐng)查看官方文檔。

callback(可選):如果執(zhí)行成功,則第一個(gè)參數(shù)為null,否則就是出錯(cuò)。

如果執(zhí)行成功,上下文this包含兩個(gè)屬性:lastID和changes。lastID表示在執(zhí)行INSERT命令語(yǔ)句時(shí),最后一條數(shù)據(jù)的id;changes表示UPADTE命令和DELETE命令時(shí)候,影響的數(shù)據(jù)行數(shù)。

db.run("UPDATE foo SET id = 1 WHERE id <= 500", function(err) {
if (err) throw err;
 //使用this.changes獲取改變的行數(shù)
 assert.equal(500, this.changes);
 done();
});

執(zhí)行多條語(yǔ)句

Database#exec(sql, [callback])

Database#exec與Database#run函數(shù)一樣,都是DDL和DML語(yǔ)句,但是Database#exec可以執(zhí)行多條語(yǔ)句,并且不支持占位符參數(shù)。

database.run("CREATE TABLE foo (id INT)", function(e){
 if(e !== null){
 throw e;
}
 //循環(huán)生成sql語(yǔ)句,批次插入多條數(shù)據(jù)
 var sql = "";
 for(var i = 0 ; i < 500; i ++){
 sql += 'INSERT INTO foo VALUES(' + i + ');'
}
 database.exec(sql, done)
});

查詢一條數(shù)據(jù)

 Database#get(sql, [param, ...], [callback])

sql:要運(yùn)行的SQL字符串。sql的類型是DQL。這里僅返回第一條查詢到的數(shù)據(jù)。

param,...(可選):同Database#run的param參數(shù)

callback(可選):同樣是返回null代表執(zhí)行成功?;卣{(diào)的簽名是function(err,row)。如果查詢結(jié)果集為空,則第二個(gè)參數(shù)為undefined;否則第二個(gè)參數(shù)值是查詢到的第一個(gè)對(duì)象,他是個(gè)json對(duì)象,屬性名稱對(duì)應(yīng)于結(jié)果集的列名稱,因此查詢的每一列都應(yīng)該給出一個(gè)列表名。

查詢所有數(shù)據(jù)

Database#all(sql, [param, ...], [callback])

sql:要運(yùn)行的SQL字符串。sql的類型是DQL。和Database#get不同,Database#all會(huì)返回所有查詢到的語(yǔ)句。

param,...(可選):同Database#run的param參數(shù)

callback(可選):同樣是返回null代表執(zhí)行成功。回調(diào)的簽名是function(err, rows) 。rows是一個(gè)數(shù)組,如果查詢結(jié)果集為空數(shù)組。

! 注意,Database#all首先檢索所有結(jié)果行并將其存儲(chǔ)在內(nèi)存中。 對(duì)于數(shù)據(jù)量可能很大的查詢命令時(shí)候,請(qǐng)使用Database#each函數(shù)或Database#prepare代替這個(gè)方法。

遍歷數(shù)據(jù)

Database#each(sql, [param, ...], [callback], [complete])

與Database#run函數(shù)相同,都是查詢多條數(shù)據(jù),但是具有以下區(qū)別:

回調(diào)的簽名是function(err,row)。如果結(jié)果集成功但為空,則不會(huì)調(diào)用回調(diào)。對(duì)于每個(gè)檢索到的行,該方法都會(huì)調(diào)用一次回調(diào)。執(zhí)行順序與結(jié)果集中的行順序完全對(duì)應(yīng)。

調(diào)用所有行回調(diào)后,如果存在complete回調(diào)函數(shù),將調(diào)用這個(gè)回調(diào)。第一個(gè)參數(shù)是一個(gè)錯(cuò)誤對(duì)象,第二個(gè)參數(shù)是檢索行數(shù)。

語(yǔ)句執(zhí)行順序 

sqlite3的API都是異步的,這就會(huì)出現(xiàn)可能有若干個(gè)命令同時(shí)進(jìn)行的情況,因此sqlite3提供了兩個(gè)函數(shù)來幫助控制語(yǔ)句的執(zhí)行流程。默認(rèn)是并行模式。

序列化執(zhí)行

 Database#serialize([callback])

如果提供回調(diào),它將立即被調(diào)用,即此方法的回調(diào)不是異步回調(diào)。在該回調(diào)中調(diào)度的所有數(shù)據(jù)庫(kù)語(yǔ)句將被序列化運(yùn)行,即一個(gè)接一個(gè)地執(zhí)行。 函數(shù)返回后,數(shù)據(jù)庫(kù)將再次設(shè)置為其原始模式。

// 這里執(zhí)行的命令是并行的
db.serialize(function() {
 // 這里執(zhí)行的命令是串行的
 db.serialize(function() {
 // 這里執(zhí)行的命令是串行的
});
 // 這里執(zhí)行的命令是串行的
});
// 這里執(zhí)行的命令是并行的

并行執(zhí)行模式

 Database#parallelize([callback])

如果提供回調(diào),它將立即被調(diào)用,即此方法的回調(diào)不是異步回調(diào)。在該回調(diào)中調(diào)度的所有數(shù)據(jù)庫(kù)語(yǔ)句將并行運(yùn)行。函數(shù)返回后,數(shù)據(jù)庫(kù)將再次設(shè)置為其原始模式。

db.serialize(function() {
 // 這里執(zhí)行的命令是串行的
 db.parallelize(function() {
 // 這里執(zhí)行的命令是并行的
});
 // 這里執(zhí)行的命令是串行的
});

預(yù)編譯SQL相關(guān)api 

在java的jdbc中,有個(gè)PreparedStatement相關(guān)的api,可以預(yù)編譯sql語(yǔ)句,執(zhí)行的時(shí)候再鏈接具體參數(shù)。這樣的好處是可以減少sql語(yǔ)句被編譯的次數(shù)。在sqlite3中,也存在實(shí)現(xiàn)這樣功能的api。

Database#prepare(sql, [param, ...], [callback])

Database#prepare執(zhí)行后,會(huì)返回一個(gè)命令對(duì)象,這個(gè)命令對(duì)象可以反復(fù)執(zhí)行。下面看看這個(gè)命令對(duì)象(statement )的api:

Statement#run([param, ...], [callback])
Statement#get([param, ...], [callback])
Statement#all([param, ...], [callback])
Statement#each([param, ...], [callback])

以上api方法與Database的同名方法調(diào)用方式相同。不同點(diǎn)是這里的Statement對(duì)象是可以復(fù)用的,避免了重復(fù)編譯sql語(yǔ)句,因此項(xiàng)目中更推薦使用上述方法。

! 注意,這些方法的param參數(shù)都會(huì)對(duì)Statement對(duì)象綁定參數(shù),在下一次執(zhí)行的時(shí)候,如果沒有重新綁定參數(shù),是會(huì)使用上一次參數(shù)的。

綁定參數(shù) 

Statement#bind([param, ...], [callback])

Database#prepare執(zhí)行的時(shí)候,是可以綁定參數(shù)的。不過使用此方法可以全重置語(yǔ)句對(duì)象和行游標(biāo),并刪除所有先前綁定的參數(shù),實(shí)現(xiàn)重新綁定的功能。

重置語(yǔ)句的行游標(biāo)

 Statement#reset([callback])

重置語(yǔ)句的行游標(biāo),并保留參數(shù)綁定。使用此功能可以使用相同的綁定重新執(zhí)行相同的查詢。

數(shù)據(jù)庫(kù)事務(wù)

事務(wù)是關(guān)系型數(shù)據(jù)庫(kù)中的一個(gè)重要部分,sqlite自然也是支持事務(wù)的,但是sqlite3并沒有提供特殊API去實(shí)現(xiàn)的事務(wù)相關(guān)的操作,只能靠SQL語(yǔ)句去控制事務(wù)。這里舉一個(gè)事務(wù)相關(guān)的例子。

var db = new sqlite3.Database(db_path);
db.run("CREATE TABLE foo (id INT, txt TEXT)");
db.run("BEGIN TRANSACTION");
var stmt = db.prepare("INSERT INTO foo VALUES(?, ?)");
for (var i = 0; i < count; i++) {
 stmt.run(i, randomString());
}
db.run("COMMIT TRANSACTION");

對(duì)SQLCipher的支持

SQLCipher是一個(gè)在SQLite基礎(chǔ)之上進(jìn)行擴(kuò)展的開源數(shù)據(jù)庫(kù),他和SQLite不同就是提供了對(duì)數(shù)據(jù)的加密,可提供數(shù)據(jù)庫(kù)文件的透明256位AES加密。

sqlite3的官網(wǎng)特意提及他對(duì)SQLCipher的集成,如果要集成sqlcipher需要在編譯時(shí)候通過構(gòu)建選項(xiàng)告訴sqlite3要集成的是SQLCipher:

npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=/usr/
node -e 'require("sqlite3")'

不過筆者并沒嘗試對(duì)SQLCipher的集成,具體集成方法請(qǐng)自行查閱官網(wǎng)對(duì)這部分的詳細(xì)介紹。

基于promise對(duì)sqlite3API的封裝 

sqlite3的API是node早期的API風(fēng)格,對(duì)異步的書寫風(fēng)格并不友好,很容易出現(xiàn)“金字塔回調(diào)”式的代碼。為了讓對(duì)API的調(diào)用更加優(yōu)雅,我們往往會(huì)把回調(diào)封裝成Promise。事實(shí)上這個(gè)工作并不需要我們自己做,sqlite3生態(tài)下已經(jīng)有其他庫(kù)可以實(shí)現(xiàn)這樣的功能。sqlite就是一個(gè)這樣的庫(kù)。他基于sqlite3,只手用Promise重新封裝了一下sqlite3的API,使其代碼風(fēng)格更加優(yōu)雅,也更容易使用。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入koa-bodyparser原理解析

    深入koa-bodyparser原理解析

    這篇文章主要介紹了深入koa-bodyparser原理解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • 淺析Node.js:DNS模塊的使用

    淺析Node.js:DNS模塊的使用

    本篇文章主要介紹了Node.js:DNS模塊的使用,DNS模塊包涵有關(guān)DNS查詢和操作的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • node.js中的fs.unlinkSync方法使用說明

    node.js中的fs.unlinkSync方法使用說明

    這篇文章主要介紹了node.js中的fs.unlinkSync方法使用說明,本文介紹了fs.unlinkSync的方法說明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 解決下載了nodejs但npm?-v沒有反應(yīng)問題的全過程

    解決下載了nodejs但npm?-v沒有反應(yīng)問題的全過程

    最近工作中遇到了個(gè)問題,node安裝成功,但npm無法使用,所以下面這篇文章主要給大家介紹了關(guān)于下載了nodejs但npm?-v沒有反應(yīng)問題解決的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 實(shí)例詳解Node.js 函數(shù)

    實(shí)例詳解Node.js 函數(shù)

    這篇文章主要介紹了Node.js 函數(shù) ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06
  • Node.js打包管理工具NPM用法

    Node.js打包管理工具NPM用法

    這篇文章介紹了Node.js打包管理工具NPM的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 使用?Node.js和Express搭建服務(wù)器的過程步驟詳解

    使用?Node.js和Express搭建服務(wù)器的過程步驟詳解

    Node.js?是一個(gè)開源、跨平臺(tái)的?JavaScript?運(yùn)行時(shí)環(huán)境,這篇文章主要介紹了如何使用?Node.js和Express搭建服務(wù)器,需要的朋友可以參考下
    2023-09-09
  • Zabbix添加Node.js監(jiān)控的方法

    Zabbix添加Node.js監(jiān)控的方法

    這篇文章主要介紹了Zabbix添加Node.js監(jiān)控的方法,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • webpack創(chuàng)建項(xiàng)目并打包的詳細(xì)流程記錄

    webpack創(chuàng)建項(xiàng)目并打包的詳細(xì)流程記錄

    webpack在前端工程領(lǐng)域起到了中流砥柱的作用,理解它的內(nèi)部實(shí)現(xiàn)機(jī)制會(huì)對(duì)你的工程建設(shè)提供很大的幫助(不論是定制功能還是優(yōu)化打包),下面這篇文章主要給大家介紹了關(guān)于webpack創(chuàng)建項(xiàng)目并打包的詳細(xì)流程,需要的朋友可以參考下
    2023-03-03
  • Nodejs 發(fā)送Post請(qǐng)求功能(發(fā)短信驗(yàn)證碼例子)

    Nodejs 發(fā)送Post請(qǐng)求功能(發(fā)短信驗(yàn)證碼例子)

    這篇文章主要介紹了Nodejs 發(fā)送Post請(qǐng)求功能(發(fā)短信驗(yàn)證碼例子),需要的朋友可以參考下
    2017-02-02

最新評(píng)論