Better-SQLite3 參數綁定詳解

Better-SQLite3 參數綁定詳解

在使用 better-sqlite3 進行數據庫操作時,參數綁定是一個非常重要的概念。它不僅提高了代碼的可讀性和安全性,還能有效防止 SQL 注入攻擊。本文將詳細介紹如何在 better-sqlite3 中使用匿名參數和命名參數,并展示一些實際應用示例。

匿名參數

匿名參數使用問號(?)作為占位符,并通過位置來綁定參數值。你可以直接傳遞參數值,或者將它們放在數組中傳遞。

示例代碼
const Database = require('better-sqlite3');
const db = new Database('mydb.sqlite');// 創建表
db.exec(`CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT,first_name TEXT NOT NULL,last_name TEXT NOT NULL,age INTEGER NOT NULL)
`);// 準備插入語句
const stmt = db.prepare('INSERT INTO people (first_name, last_name, age) VALUES (?, ?, ?)');// 插入數據 - 直接傳遞參數
stmt.run('John', 'Smith', 45);
console.log('Inserted John Smith.');// 插入數據 - 使用數組傳遞參數
stmt.run(['Jane', 'Doe', 30]);
console.log('Inserted Jane Doe.');// 插入數據 - 混合方式傳遞參數
stmt.run(['Alice'], ['Brown', 28]);
console.log('Inserted Alice Brown.');// 釋放資源
stmt.finalize();// 查詢所有記錄以驗證插入結果
const selectStmt = db.prepare("SELECT * FROM people");
const rows = selectStmt.all();
rows.forEach((row) => {console.log(`ID: ${row.id}, First Name: ${row.first_name}, Last Name: ${row.last_name}, Age: ${row.age}`);
});
selectStmt.finalize();// 關閉數據庫連接
db.close();
console.log('Database connection closed.');

在這個示例中,我們創建了一個 people 表,并使用匿名參數插入了幾條記錄。可以看到,無論是直接傳遞參數還是通過數組傳遞參數,都可以實現同樣的效果。

命名參數

命名參數允許你為每個參數指定一個名稱,這樣可以更清晰地標識每個參數的作用。SQLite 支持三種命名參數語法:@foo:foo$foo,這些都受 better-sqlite3 支持。

示例代碼
const Database = require('better-sqlite3');
const db = new Database('mydb.sqlite');// 創建表
db.exec(`CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT,first_name TEXT NOT NULL,last_name TEXT NOT NULL,age INTEGER NOT NULL)
`);// 準備插入語句 - 使用 @ 符號命名參數
const stmt1 = db.prepare('INSERT INTO people (first_name, last_name, age) VALUES (@firstName, @lastName, @age)');
stmt1.run({firstName: 'John',lastName: 'Smith',age: 45
});
console.log('Inserted John Smith using @ notation.');// 準備插入語句 - 使用 : 符號命名參數
const stmt2 = db.prepare('INSERT INTO people (first_name, last_name, age) VALUES (:firstName, :lastName, :age)');
stmt2.run({firstName: 'Jane',lastName: 'Doe',age: 30
});
console.log('Inserted Jane Doe using : notation.');// 準備插入語句 - 使用 $ 符號命名參數
const stmt3 = db.prepare('INSERT INTO people (first_name, last_name, age) VALUES ($firstName, $lastName, $age)');
stmt3.run({firstName: 'Alice',lastName: 'Brown',age: 28
});
console.log('Inserted Alice Brown using $ notation.');// 查詢所有記錄以驗證插入結果
const selectStmt = db.prepare("SELECT * FROM people");
const rows = selectStmt.all();
rows.forEach((row) => {console.log(`ID: ${row.id}, First Name: ${row.first_name}, Last Name: ${row.last_name}, Age: ${row.age}`);
});// 關閉數據庫連接
db.close();
console.log('Database connection closed.');

在這個示例中,我們展示了如何使用不同符號的命名參數插入數據。無論使用哪種符號,都能達到相同的效果。

混合匿名參數與命名參數

你可以在同一個 SQL 語句中混合使用匿名參數和命名參數。在這種情況下,匿名參數按順序綁定,而命名參數通過對象傳遞。

示例代碼
const Database = require('better-sqlite3');
const db = new Database('mydb.sqlite');// 創建表
db.exec(`CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER NOT NULL)
`);// 準備插入語句 - 混合使用匿名參數和命名參數
const stmt = db.prepare('INSERT INTO people (name, age) VALUES (@name, ?)');// 插入數據 - 先傳遞匿名參數,再傳遞命名參數
stmt.run(30, { name: 'Henry' });
console.log('Inserted Henry with age 30.');// 查詢所有記錄以驗證插入結果
const selectStmt = db.prepare("SELECT * FROM people");
const rows = selectStmt.all();
rows.forEach((row) => {console.log(`ID: ${row.id}, Name: ${row.name}, Age: ${row.age}`);
});// 關閉數據庫連接
db.close();
console.log('Database connection closed.');

在這個示例中,我們展示了如何在一個 SQL 語句中同時使用匿名參數和命名參數。

數據類型轉換

better-sqlite3 在 JavaScript 和 SQLite 之間自動進行數據類型的轉換,具體如下:

SQLiteJavaScript
NULLnull
REALnumber
INTEGERnumber or BigInt
TEXTstring
BLOBBuffer
示例代碼

以下是一個展示不同類型數據轉換的示例:

const Database = require('better-sqlite3');
const db = new Database('mydb.sqlite');// 創建表
db.exec(`CREATE TABLE IF NOT EXISTS data_types (id INTEGER PRIMARY KEY AUTOINCREMENT,real_value REAL,integer_value INTEGER,text_value TEXT,blob_value BLOB)
`);// 準備插入語句
const insertStmt = db.prepare('INSERT INTO data_types (real_value, integer_value, text_value, blob_value) VALUES (?, ?, ?, ?)');// 插入不同類型的值
insertStmt.run(3.14, // REAL42,   // INTEGER'Hello, World!', // TEXTBuffer.from('Binary Data') // BLOB
);// 釋放資源
insertStmt.finalize();// 查詢所有記錄以驗證插入結果
const selectStmt = db.prepare("SELECT * FROM data_types");
const rows = selectStmt.all();
rows.forEach((row) => {console.log(`ID: ${row.id}, Real Value: ${row.real_value}, Integer Value: ${row.integer_value}, Text Value: ${row.text_value}, Blob Value: ${row.blob_value.toString()}`);
});// 關閉數據庫連接
db.close();
console.log('Database connection closed.');

總結

  • 匿名參數:使用問號(?)作為占位符,通過位置綁定參數。
  • 命名參數:支持 @foo:foo$foo 三種命名參數語法,通過對象綁定參數。
  • 混合使用:可以在同一 SQL 語句中混合使用匿名參數和命名參數。
  • 數據類型轉換better-sqlite3 自動在 JavaScript 和 SQLite 之間進行數據類型的轉換。

通過合理使用參數綁定,可以提高代碼的可讀性、安全性和維護性。希望這篇文章對你有所幫助!如果有更多問題或需要進一步的幫助,請隨時提問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71824.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++編程:進階階段—4.1封裝

C面向對象的三大特性:封裝、繼承、多態 具有相同性質的對象,抽象為類 4.1 封裝 封裝的意義:將屬性和行為作為一個整體,表現生活中的事物,并將屬性和行為加以權限控制。 4.1.1 類的定義及實例化對象 語法&#xff…

運行OpenManus項目(使用Conda)

部署本項目需要具備一定的基礎:Linux基礎、需要安裝好Anaconda/Miniforge(Python可以不裝好,直接新建虛擬環境的時候裝好即可),如果不裝Anaconda或者Miniforge,只裝過Python,需要確保Python是3.…

spring boot + vue 搭建環境

參考文檔:https://blog.csdn.net/weixin_44215249/article/details/117376417?fromshareblogdetail&sharetypeblogdetail&sharerId117376417&sharereferPC&sharesourceqxpapt&sharefromfrom_link. spring boot vue 搭建環境 一、瀏覽器二、jd…

MPPT與PWM充電原理及區別詳解

MPPT(最大功率點跟蹤)和PWM(脈寬調制)是太陽能充電控制器中常用的兩種技術,它們在原理、效率和適用場景上有顯著區別。以下是兩者的詳細對比: 1. 工作原理 PWM(脈寬調制) 核心機制…

slam學習筆記9---ubuntu2004部署interactive_slam踩坑記錄

背景:interactive_slam是一款可用于離線優化點云地圖算法。部署安裝容易出問題,這里記錄一下。 一、安裝基本流程 絕大部分跟著readme走,g2o安裝使用apt安裝 interactive_slam depends on the following libraries:GL3W GLFW Dear ImGui p…

視覺圖像處理

在MATLAB中進行視覺圖像處理仿真通常涉及圖像增強、濾波、分割、特征提取等操作。以下是一個分步指南和示例代碼,幫助您快速入門: 1. MATLAB圖像處理基礎步驟 1.1 讀取和顯示圖像 % 讀取圖像(替換為實際文件路徑) img = imread(lena.jpg); % 顯示原圖 figure; subplot(2…

用java如何利用jieba進行分詞

在Java中使用jieba進行分詞,可以借助jieba的Java版本——jieba-analysis。jieba-analysis是一個基于jieba分詞算法的Java實現,支持精確模式、全模式和搜索引擎模式等多種分詞方式。 以下是使用jieba-analysis進行分詞的詳細步驟和示例代碼: …

【含文檔+PPT+源碼】Python爬蟲人口老齡化大數據分析平臺的設計與實現

項目介紹 本課程演示的是一款Python爬蟲人口老齡化大數據分析平臺的設計與實現,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Python學習者。 1.包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本…

【A2DP】SBC 編解碼器互操作性要求詳解

目錄 一、SBC編解碼器互操作性概述 二、編解碼器特定信息元素(Codec Specific Information Elements) 2.1 采樣頻率(Sampling Frequency) 2.2 聲道模式(Channel Mode) 2.3 塊長度(Block Length) 2.4 子帶數量(Subbands) 2.5 分配方法(Allocation Method) 2…

Android雙親委派

下面是一份 Android 類加載器雙親委派機制的時序圖示例,描述了當應用調用 loadClass() 時,各個加載器之間的委派過程。 #mermaid-svg-rBdlhpD2uRjBPiG8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…

記錄小白使用 Cursor 開發第一個微信小程序(二):創建項目、編譯、預覽、發布(250308)

文章目錄 記錄小白使用 Cursor 開發第一個微信小程序(二):創建項目、編譯、預覽、發布(250308)一、創建項目1.1 生成提示詞1.2 生成代碼 二、編譯預覽2.1 導入項目2.2 編譯預覽 三、發布3.1 在微信開發者工具進行上傳3…

Linux系統管理二

目錄 一.遠程連接管理服務SSH 1.1 了解服務端和客戶端 1.2 了解端口號的設定 1.3 了解ssh服務的作用 1.4 ssh搭建服務 二.netstat 2.1 netstat簡介 2.2 netstat命令參數 2.3 常用命令參考 三.進程的檢測與控制 3.1 管道 3.1.1 什么是管道 3.1.2 管道的分類 3.1.3…

【Recon】Git源代碼泄露題目解題方法

CTF中Git源代碼泄露題目解題方法 1. 確認存在.git目錄泄露2. 下載完整的.git目錄3. 恢復Git倉庫歷史4. 查找Flag的常見位置5. 處理不完整的.git目錄6. 其他技巧示例流程 在CTF中遇到Git源代碼泄露題目時,通常可以通過以下步驟解決: 1. 確認存在.git目錄泄…

字符串 反轉函數reverse() 的錯誤用法

回文字符串 題目描述 如果一個字符串逆序后與正序相同,那么稱這個字符串為回文字符串。例如abcba是回文字符串,abcca不是回文字符串。 給定一個字符串,判斷它是否是回文字符串。 輸入描述 一個非空字符串(長度不超過 50&#…

C#程序加密與解密Demo程序示例

目錄 一、加密程序功能介紹 1、加密用途 2、功能 3、程序說明 4、加密過程 5、授權的注冊文件保存方式 二、加密程序使用步驟 1、步驟一 ?編輯2、步驟二 3、步驟三 4、步驟四 三、核心代碼說明 1、獲取電腦CPU 信息 2、獲取硬盤卷標號 3、機器碼生成 3、 生成…

專題二串聯所有單詞的子串

1.題目 題目分析: 有一個字符串s和字符串數組,如何字符串數組里面的元素可以組成一個字符串,然后要在字符串里面找到連續子串跟組成的字符串一樣,返回起始地址。 2.算法原理 這道題可以把字符串數組的元素string看出char&#x…

scala類型檢測和轉換

在scala中關于類型的檢測的api一共有以下三個: (1)obj.isInstanceOf[T]:判斷 obj 是不是 T 類型。 (2)obj.asInstanceOf[T]:將 obj 強轉成 T 類型。 (3)classOf[T]&am…

【論文閱讀】VAD: Vectorized Scene Representation for Efficient Autonomous Driving

一、介紹 VAD是華科團隊設計的一個端到端無人駕駛框架,針對傳統的無人駕駛框架的模塊化設計的問題,該算法使用向量化的策略進行了端到端的實現。傳統的模塊化設計使得感知模塊完全依賴于感知模塊的計算結果,這一解耦實際上從規劃模塊的角度損…

探索Java多線程的核心概念與實踐技巧,帶你從入門到精通!

各位看官早安午安晚安呀 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連,小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習多線程編程-"掌握線程創建、管理與安全": 上一節課程我們鋪墊了一系列的東西,引出來了我們的多…

互動多媒體項目 自行車互動

該項目為UE4 +自行車騎行速度 互動項目 結果預覽 : 1. 獲取自行車速度 這里使用的是Arduino單片機 + 霍爾傳感器 霍爾傳感器: 單片機完整代碼: #define HALL_PIN 2 // 霍爾傳感器連接到D2(中斷引腳) volatile unsigned long lastTime = 0; // …