【electron】TypeORM 搭配 SQLite 简易使用

3,100 阅读2分钟

TypeORM

TypeORM 可以拆为两部分理解:

  1. Type:使用 typesript
  2. ORM:运行在多平台(Nodejs、Browser、Electron等)的一种帮助开发数据库相关的框架

SQLite

SQLite 是一个非常轻量级的数据库,学习成本低,用于处理中小型数据存储。

创建链接

创建数据库声明文件

// data-source.ts
import { DataSource } from 'typeorm'
import User from '../model/User'
import { app } from 'electron'
import path from 'path'

const configPath = app.getPath('userData')
const database = path.join(configPath, 'database.sqlite');

export const AppDataSource = new DataSource({
  type: "sqlite", // 设定链接的数据库类型
  database, // 数据库存放地址
  synchronize: true, // 确保每次运行应用程序时实体都将与数据库同步
  logging: ['error','warn'], // 日志,默认在控制台中打印,数组列举错误类型枚举
  entities: [Infer], // 实体或模型表
})

主进程函数进行初始化

// index.ts
import { app } from 'electron'
import { AppDataSource } from './database/data-source'

app.whenReady().then(async () => {
  if (!AppDataSource.isInitialized) {
    const [err, _res] = await to(AppDataSource.initialize())
    if (err) {
      throw err
    }
  }
})

实体

使用装饰器来快速定义实体,用 @Entity 标记。每个实体至少需要一个主列,一般是 @PrimaryColumn(),如果是自增id,用 @PrimaryGeneratedColumn,普通列使用 @Column

import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';

@Entity() // 实体
export default class User {
  @PrimaryGeneratedColumn() // 自增主键
  id: number

  @Column({ type: 'varchar' }) // Column 普通列
  name: string // js 数据类型

  @Column({ type: 'int' }) // type 数据库键类型
  age: number

  @Column({ type: 'varchar', nullable: true }) // nullable,非必须
  hobby: string
}

实操

getRepository: 获取实体

createQueryBuilder:查询构造器,返回 QueryBuilder,可以用简洁的语义化语句执行SQL查询

详细操作:

  • insert 插入
  • delete 删除
  • getCount 获取总数
  • execute 执行操作

查询相关:

  • where、andWhere、orWhere 条件查询
  • limit 做分页
  • getOne 获取单个结果
  • getMany 获取多个结果
// userService.ts
import { AppDataSource } from '../database/data-source';
import User from '../model/User';

// 获取存储库
const getUserQueryBuilder = async () => {
  return AppDataSource.getRepository(User).createQueryBuilder('user');
};

const userQueryBuilder = 
// 读取第一条记录
export const getFirstUser = async (name: string) => {
  const userQueryBuilder = await getUserQueryBuilder();
  return userQueryBuilder
    .where('user.name = :name', { name }) // 注意是别名 user 不是 User
    .limit(1)
    .getOne();
};

// 插入数据
export const insertUsers = async (userData: User[]) => {
  const userQueryBuilder = await getUserQueryBuilder();
  return userQueryBuilder.insert().values(userData).execute(); // 允许插入多条数据
};

// 删除单个
export const deleteUserById = async (id: number) => {
  const userQueryBuilder = await getUserQueryBuilder();
  return userQueryBuilder.delete().where('id = :id', { id }).execute();
};

// 删除所有记录
export const deleteAllUser = async () => {
  const userQueryBuilder = await getUserQueryBuilder();
  return userQueryBuilder.delete().execute();
}

// 获取总数
export const getUserCount = async () => {
  const inferQueryBuilder = await getInferQueryBuilder();
  return inferQueryBuilder.getCount();
}

调用

import to from 'await-to-js'
import { getUserCount } from '../services/userService';

const getUserCount = () => {
  const [err, res] = await to(getUserCount());
  if (err) {}
  if (res) {}
  // finally do something
}