Node.js整合使用Sqlite3
大部份的程式都會做資料記錄,而儲存紀錄的方式很多,由最簡單的文字檔txt、JSON、XML…等,都可以把資料紀錄在獨立一個檔案,也可以考慮使用sqlite,可 以使用SQL語法來建立、更新、刪除資料,我認為這是一個很好的選擇…
說到資料庫,大部份的人都會想到MySQL、MS SQL Server、PostgreSQL、mongodb,不過對於實作一個小程式來說,使用上述的資料庫有點大材小用,我的需求是能使用SQL作簡單的資料新增、修改、刪除及條件查詢,初期只會有兩個資料表(存記錄、存設定),所以Sqlite就是一個很好的選擇。
想知道最新消息、版本資訊,亦或是說明文件,可以進入 Sqlite官網 查看,下面就直接進入 下班小幫手 ,如何使用node去操作Sqlite。
關於程式的撰寫,不知道有多少人會根據功能寫獨立的模組,或是全部都寫在main.js就好? 這個部份,就我看過的書來說,很多都不會特別讓程式「獨立」一個檔案(模組),一股腦的全部寫在一個檔案(例如:main.js、index.js),所以在Side Project時候就會去想是不是需要獨立模組js出來,要如何分出來,檔案資料庫結構應該如何,參考github上的範例,好像也找不出什麼規則,後來的結論是…以自己看的懂的結構就可以XD。
安裝Sqlite3
npm install sqlite3 --save
初始化資料庫
建立*.db檔,並判斷是否存在資料表,不存在資料表,則立即新增。 新增資料表的時候使用「db.run」,
- 參數1為欲執行的SQL
- 參數2為參數1要代入的常式
- 參數3為執行的callback,此callback不會回應執行的結果,例如參數1為SELECT,callback不會回應搜尋的結果,callback只會回應是否有錯誤,當執行有錯誤,第一參數會是錯誤的資訊;如果沒有錯誤,則為null。
//載入,並取得sqlite3的物件
const sqlite3 = require('sqlite3').verbose();
//建立資料庫檔案(*.db),如果已存在db檔案,則不再次新增,直接取用原db檔。
let db = new sqlite3.Database('loginLog.db', (err) => {
if (err) {
//發生錯誤,顯示錯誤訊息。
console.error(err.message);
}
//判斷是否已存在資料表WorkLog,如果不存在則建立。
//ID:數字型態,自動設值的欄位,1、2、3…。
//LogTime :字串型態,紀錄上、下班時間。
//Type: 數字型態,定義為 0-無狀態、1-上班、2-下班。預設值為0。
db.run(`
CREATE TABLE IF NOT EXISTS WorkLog (
ID INTEGER PRIMARY KEY,
LogTime TEXT,
Type INTEGER DEFAULT 0
);
`);
//建立Setting資料表,程式略…
});
搜尋紀錄
因為db.run不會回應SQL執行的內容,所以在搜尋記錄的部分會使用另一個方法「db.all」來取得打卡記錄。
let strSQL = `SELECT FROM WorkLog WHERE LogTime BETWEEN ${StartDateTime} AND ${EndDateTime}`;
db.all(strSQL, [], (err, rows){
//回應符合條件的打卡紀錄
});
新增紀錄
因為新增記錄,只需要知道新增是否成功,所以此處可以使用db.run,再根據callback的第一個參數了解是否執行成功。
let now = new Date(); //目前時間。
let type = 1; //表示上班。
db.run(`INSERT INTO WorkLog(LogTime, Type) VALUES(?,?)`, [now, type], (err)=>{
//如果執行有錯誤,err即為錯誤資訊。
//如果新增成功,則err為null。
};
其他執行的方法
//db.get,取得資料,只會回應符合條件的第一筆資料。例如:
db.get(`SELECT * FROM WorkLog ORDER BY LogTime DESC`, [], (err, row){
//如果執行有誤,err為錯誤訊息/原因;如果無誤,則為null
//row,為符合搜尋的第一筆資料;如果沒有回應資料,則為undefined
});
由上述內容應該就可以知道當需要更新、刪除記錄的時候,應該使用什麼方法執行了。
更新一筆記錄(或是之後會加入實作的更新設定值),使用db.run,因為執行更新的時候只需要知道執行是否成功,不會有回應資訊。
同樣地,刪除一筆記錄的一樣也是使用db.run,只需要知道執行是否成功即可