better-sqlite3
Node.js 中最快、最简单的 SQLite3 库。
- 全面的交易支持
- 高性能、高效、安全
- 易于使用 (提供了一组简单的方法,使得创建数据库、执行查询、绑定参数等操作非常简单)
- 跨平台支持(在windows、macOS和Linux等主要平台使用)
使用
- 安装依赖
npm i better-sqlite3
// 目前使用的是 better-sqlite3@9.5.0版本
- 创建数据库,并建表
const myDatabse = require('better-sqlite3');
// 创建一个名为mydatabse.db的SQLite数据库
const db = new Database('mydatabase.db');
// 建表语句
const createTableSql = `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT,
email TEXT
)
`;
// 执行sql语句
db.exec(createTableSql);
// 执行sql语句方式二
const stmt = db.prepare(createTableSql)
stmt.run()
// 此方式可以减少在每次执行查询时重新编译SQL语句的开销,当需要多次执行查询时,可以通过stmt对象的get(), all()等方法来执行查询
- 插入数据
const insertSql = 'INSERT INTO users (username, email) VALUES (?, ?)';
const stmt = db.prepare(insertSql);
const res = stmt.run("zhangsan", "abc@qq.com");
// 当参数比较多时, 可以使用具名参数的方式,传入对象,用法如下
const insertSql = 'INSERT INTO users (username, email) VALUES (@username, @email)';
const stmt = db.prepare(insertSql);
stmt.run({ username: "lisi", email: "12345@qq.com" });
- 更新数据
const updateSql = 'UPDATE users SET username = ?, email = ? WHERE id = ?';
const stmt = db.prepare(updateSql);
const res = stmt.run("zhangsan", "abc@qq.com", 1);
// 具名参数用法(针对更新字段较多时)
const updateSql = 'UPDATE users SET username = @username, email = @email WHERE id = @id';
const stmt = db.prepare(updateSql);
stmt.run({ username: "xxx", email: "abc@qq.com", id: 2});
- 删除数据
db.prepare('DELETE FROM users WHERE id = ?').run(2);
- 查询数据
// 查询所有数据
db.prepare('SELECT * FROM users').all();
// 根据条件查询(查询用户名为张三的数据)
db.prepare('SELECT * FROM users where username = ?').get('zhangsan')
- 事务(transaction)
// 批量插入用户数据
const insert = db.prepare('INSERT INTO users (username, email) VALUES (@username, @email)');
const insertMany = db.transaction((users) => {
for (const user of users) insert.run(user);
});
try {
insertMany([
{ username: 'Joey', email: 2 },
{ username: 'Sally', email: 4 },
{ username: 'Junior', email: 1 },
]);
console.log("批量执行成功...")
} catch(err) {
// 当批量执行失败, 则会回滚事务
console.log(err)
}
封装better-sqlite3常用操作
- 封装database (myDb.js),并进行数据库的初始化操作
/**
* 封装better-sqlite3
*/
const Datebase = require('better-sqlite3');
class MyDatabase {
constructor(dbPath) {
// 建立数据库连接
this.db = new Datebase(dbPath);
this.initialize();
}
// 创建表
initialize() {
// 初始化脚本
const createTableSql = `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT,
email TEXT
)
`;
this.db.exec(createTableSql);
}
}
const myDb = new MyDatabase('data.db');
export default myDb.db;
- 增删改查 (userDao.js)
/**
* 封装better-sqlite3的增删改查方法
*/
import db from './myDb';
/**
* 插入用户 - 多参数方式传入
* @param {*} username
* @param {*} email
*/
export function insertUser(username, email) {
const insertSql = 'INSERT INTO users (username, email) VALUES (?, ?)';
const stmt = db.prepare(insertSql);
const res = stmt.run(username, email);
return res;
}
/**
* 插入用户 - 对象形式传入
* @param {*} user { username: xxx, email: xxx }
* @returns
*/
export function insertUserObject(user) {
const insertSql = 'INSERT INTO users (username, email) VALUES (@username, @email)';
const stmt = db.prepare(insertSql);
const res = stmt.run(user);
return res;
}
/**
* 批量插入
* @param {*} users [ {username: xxx, email: xxx}, {username: xxx, email: xxx}]
* @returns
*/
export function batchInsertUser(users) {
try {
db.transaction(() => {
const insert = db.prepare('INSERT INTO users (username, email) VALUES (@username, @email)');
for (const item of users) {
insert.run(item);
}
})();
return true;
} catch (err) {
return null;
}
}
/**
* 查询所有
* @returns
*/
export function getUsers() {
const res = db.prepare('SELECT * FROM users').all();
return res;
}
/**
* 根据用户名查询
* @param {*} username
* @returns
*/
export function getUsersByName(username) {
const res = db.prepare('SELECT * FROM users WHERE username = ?').get(username);
return res;
}
/**
* 更新用户
* @param {*} user { id: xxx, username: xxx, email: xxxx}
* @returns
*/
export function updateUser(user) {
const res = db.prepare('UPDATE users SET username = @username, email = @email WHERE id = @id').run(user);
return res;
}
/**
* 删除用户
* @param {*} id
* @returns
*/
export function deleteUser(id) {
const res = db.prepare('DELETE FROM users WHERE id = ?').run(id);
return res;
}
在electron中使用better-sqlite3的问题
- electron启动报错
解决方案
// 安装electron-rebuild依赖包(当前版本3.2.9)
yarn add electron-rebuild -D
// 编写脚本 package.json
{
...
"scripts": {
"rebuild": "electron-rebuild -f -w better-sqlite3"
}
}
// 执行脚本
yarn rebuild
// 可以在dev的增加预编译脚本 package.json
{
"dev": "yarn rebuild && chcp 65001 && vite --host 0.0.0.0",
"rebuild": "electron-rebuild -f -w better-sqlite3"
}