TypeORM
TypeORM 可以拆为两部分理解:
- Type:使用 typesript
- 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
}