1、sqlite3、typeorm
sqlite3是一个轻量级的、嵌入式的关系型数据库。TypeORM 是一个使用 TypeScript 和 JavaScript 开发的开源 ORM(对象关系映射)库,可以通过对象模型与数据库进行交互。
2、所需环境
sqlite3 是一个 C++ 语言编写的轻量级数据库,打包时需要node-gyp编译 C++ 源代码则需要以下环境
- Visual Studio
- Python
- Node.js
3、封装
- 创建实体类
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'
@Entity('user') //实体类类名
export class Settings {
@PrimaryGeneratedColumn() //主键装饰器
id: number
@Column({ type: 'text' }) //列装饰器
user_name: string
@Column({ type: 'text'})
password: string
}
- 创建、连接接数据库
import { app } from 'electron'
import path from 'path'
import { DataSource, EntityTarget, Repository } from 'typeorm'
import { user } from './entityClass'
export const db = new DataSource({
type: 'sqlite', // 数据库类型
database: path.join(app.getPath('userData'), 'LocalDatabase.db'), // 根据路径创建数据库
synchronize: true, // 启动时自动同步数据库
logging: ['error', 'warn'], // 记录错误、警告日志
entities: [user] // 使用创建的实体类
})
export const initialize = async () => {
try {
await db.initialize() // 连接数据库
console.log('数据库连接成功')
} catch (error) {
console.error('数据库连接失败:', error)
}
}
- 动态获取对应的数据库对象,以便操作
export const getRepositoryByEntity = <T>(entity: EntityTarget<T>): Repository<T> => {
return db.getRepository(entity)
}
export const getEntityByName = (entityName: string): EntityTarget<T> => {
switch (entityName) {
case 'todo':
rereturn todo
default:
throw new Error(`无法找到实体类: ${entityName}`)
}
}
- 统一处理数据库回调
export const handleRepositoryOperation = async <T>(
entityName: string,
operation: (repository: Repository<any>) => Promise<T>
): Promise<{ status: 'success' | 'fail'; message?: string; rows?: T }> => {
try {
const entity = getEntityByName(entityName);
const repository = getRepositoryByEntity(entity);
const data = await operation(repository);
return { status: 'success', rows: data };
} catch (err) {
return { status: 'fail', message: err.message };
}
};
5.封装增删改查函数
// 插入数据
ipcMainHandle('insert-document', async (event, entityName: string, params: any) => {
return handleRepositoryOperation(entityName, async repository => {
const record = repository.create(params)
const savedRecord = await repository.save(record)
return { id: savedRecord.id }
})
})
// 查询数据
ipcMainHandle('find-documents', async (event, entityName: string, query: any, params: any) => {
return handleRepositoryOperation(entityName, async repository => {
const rows = await repository.find({ where: query, ...params })
return rows
})
})
// 更新数据
ipcMainHandle('update-document', async (event, entityName: string, query: any, params: any) => {
return handleRepositoryOperation(entityName, async repository => {
const record = await repository.findOne({ where: query })
if (!record) {
throw new Error('记录未找到')
}
Object.assign(record, params)
await repository.save(record)
return { changes: 1 }
})
})
// 删除数据
ipcMainHandle('delete-document', async (event, entityName: string, query: any) => {
return handleRepositoryOperation(entityName, async repository => {
const record = await repository.findOne({ where: query })
if (!record) {
throw new Error('记录未找到')
}
await repository.remove(record)
return { changes: 1 }
})
})