electron集成sqlite3、typeorm

182 阅读2分钟

1、sqlite3、typeorm

sqlite3是一个轻量级的、嵌入式的关系型数据库。TypeORM 是一个使用 TypeScript 和 JavaScript 开发的开源 ORM(对象关系映射)库,可以通过对象模型与数据库进行交互。

2、所需环境

sqlite3 是一个 C++ 语言编写的轻量级数据库,打包时需要node-gyp编译 C++ 源代码则需要以下环境

  1. Visual Studio
  2. Python
  3. Node.js

3、封装

  1. 创建实体类
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
}
  1. 创建、连接接数据库
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)
  }
}
  1. 动态获取对应的数据库对象,以便操作
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}`)
  }
}
  1. 统一处理数据库回调
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 }
    })
  })