中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sqlite怎么在nodejs中使用

發布時間:2021-03-30 16:53:28 來源:億速云 閱讀:337 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關sqlite怎么在nodejs中使用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

安裝

基于npm安裝

npm install sqlite3

這樣除了安裝完sqlite3的npm包,最主要的是也裝完了sqlite數據庫,因為sqlite是嵌入式數據庫,嵌入到客戶端中。sqlite3使用node-pre-gyp為各個平臺下載指定的預編譯的二進制文件。如果無法下載到預編譯的二進制文件,sqlite3將使用node-gyp和源代碼來構建擴展。

這個過程出現兩個的庫——node-pre-gyp和node-gyp。他們究竟是什么呢?

node-gyp是一個跨平臺的命令行工具,用于編譯C++編寫的nodejs擴展,首先gyp是為Chromium項目創建的項目生成工具,可以從平臺無關的配置生成平臺相關的Visual Studio、Xcode、Makefile的項目文件,node-gyp就是將其集成到nodejs中。因為linux的二進制分發快平臺做的并不好,所有npm為了方便干脆就直接源碼分發,用戶裝的時候再現場編譯。不過對有些項目二進制分發就比源碼分發簡單多了,所以還有個node-pre-gyp來直接二進制擴展的分發。

兩者區別在于node-gyp是發布擴展的源碼,然后安裝時候編譯;node-pre-gyp是直接發布編譯后的二級制形式的擴展。

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

基礎api 

sqlite3的api都是基于函數回調的,因為nodejs中沒有像java的jdbc那種官方的數據庫客戶端接口,因此每個數據庫的api都不一樣,這里簡單介紹幾個sqlite3重要的api。

新建并打開數據庫

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

該方法返回一個自動打開的數據庫對象,參數:

filename:有效值是一個文件名,如:“mydatebase.db”,數據庫打開之后會創建一個“mydatebase.db”的文件用于保存數據。如果文件名是“:memory:”,表示是一個內存數據庫(類似h3那種),數據不會持久化保存,當關閉數據庫時,內容將丟失。

mode(可選):數據庫的模式,共3種值:sqlite3.OPEN_READONLY(只讀),sqlite3.OPEN_READWRITE(可讀寫)和sqlite3.OPEN_CREATE(可以創建)。 默認值為OPEN_READWRITE |OPEN_CREATE。

callback(可選):則當數據庫成功打開或發生錯誤時,將調用此函數。 第一個參數是一個錯誤對象,當它為空時,表示打開成功。

打開一個數據庫,如:

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

執行后會在項目的根目錄生成一個“mydatebase.db”文件,這就是sqlite保存數據的文件了。

關閉數據庫

Database#close([callback])

該方法可以關閉一個數據庫連接對象,參數:

callback(可選):關閉成功的回調。 第一個參數是一個錯誤對象,當它為“null”時,表示關閉成功。

執行DDL和DML語句 

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

該方法可以執行DDL和DML語句,如建表、刪除表、刪除行數據、插入行數據等,參數:

sql:要運行的SQL字符串。sql的類型是DDL和DML,DQL不能使用這個命令。執行后返回值不包含任何結果,必須通過callback回調函數獲取執行結果。

param,...(可選):當SQL語句包含占位符(?)時,這里可以傳對應的參數。 這里有三種傳值方法,如:

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



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



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

關于占位符的命名,sqlite3還支持更復雜的形式,這里不再擴展,有興趣了解的話請查看官方文檔。

callback(可選):如果執行成功,則第一個參數為null,否則就是出錯。

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

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

執行多條語句

Database#exec(sql, [callback])

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

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])

重置語句的行游標,并保留參數綁定。使用此功能可以使用相同的綁定重新執行相同的查詢。

數據庫事務

事務是關系型數據庫中的一個重要部分,sqlite自然也是支持事務的,但是sqlite3并沒有提供特殊API去實現的事務相關的操作,只能靠SQL語句去控制事務。這里舉一個事務相關的例子。

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");

對SQLCipher的支持

SQLCipher是一個在SQLite基礎之上進行擴展的開源數據庫,他和SQLite不同就是提供了對數據的加密,可提供數據庫文件的透明256位AES加密。

sqlite3的官網特意提及他對SQLCipher的集成,如果要集成sqlcipher需要在編譯時候通過構建選項告訴sqlite3要集成的是SQLCipher:

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

關于sqlite怎么在nodejs中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上杭县| 石泉县| 虎林市| 金湖县| 微山县| 嘉善县| 武清区| 武邑县| 璧山县| 七台河市| 慈溪市| 彩票| 壤塘县| 缙云县| 凤冈县| 台北县| 万安县| 巴青县| 铁岭市| 祁阳县| 黑水县| 剑阁县| 凤庆县| 通江县| 祥云县| 深水埗区| 安西县| 定日县| 阜新市| 潜山县| 内黄县| 龙江县| 曲水县| 灵宝市| 巨鹿县| 昌吉市| 潼南县| 教育| 祥云县| 怀来县| 高密市|