TypeORM
安装 TypeORM 插件
npm install @summer-js/typeorm
npm install mysql2
添加数据源
src/config/default.config.ts
import { TypeORMConfig } from '@summer-js/typeorm'
export const TYPEORM_CONFIG: TypeORMConfig = {
DATA_SOURCE: {
type: 'mysql',
host: 'localhost',
database: 'dbname',
username: 'root',
password: 'root'
// 你不需要添加 entities/migrations, Summer会自动收集他们
}
}
提示
Summer TypeORM plugin 或自动收集 entities/migrations
创建Entity
src/entity/Todo.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
@Entity()
export class Todo {
@PrimaryGeneratedColumn()
id: number
@Column()
content: string
@Column()
isDone: boolean
}
使用 Repository 做增删改查
提示
Repository<T, DataSourceName?: string = FirstDataSource> 是一个泛型可注入对象,会被Summer自动注入.
Repository对象会默认链接第一个数据源,如果你想要连接不同的数据源,你需要加上第二个参数。
src/service/TodoService.ts
import { Service } from '@summer-js/summer'
import { Repository } from '@summer-js/typeorm'
import { Todo } from '../entity/Todo'
@Service
export class TodoService {
// auto inject
todoRepository: Repository<Todo>
async getTodos() {
return await this.todoRepository.find()
}
async addTodo() {
const todo = new Todo()
return await this.todoRepository.save(todo)
}
}
从数据源获取Repository
你也可以通过调用 getDataSource("DATA_SOURCE_NAME").getRepository(entity) 去获取Repository实例。
注入的写法当然更优雅,但是仅可是在class中使用 getRepository() api可以在任何地方使用。
src/DataSource.ts
import { EntityTarget } from 'typeorm'
import { getDataSource } from '@summer-js/typeorm'
export const getRepository = <T>(entity: EntityTarget<T>) => {
return getDataSource('DATA_SOURCE').getRepository(entity)
}
src/service/TodoService.ts
import { Service } from '@summer-js/summer'
import { getRepository } from '../DataSource.ts'
import { Todo } from '../entity/Todo'
@Service
export class TodoService {
todoRepository = getRepository(Todo)
}
事务支持
Summer 提供了事务相关的装饰器,以下代码数据将不会被存储,因为在事务操作时抛出了错误异常,数据被回滚到方法未执行前的状态。
src/service/TodoService.ts
import { Service } from '@summer-js/summer'
import { Repository, Transaction, transaction} from '@summer-js/typeorm'
import { Todo } from '../entity/Todo'
@Service
export class TodoService {
todoRepository: Repository<Todo>
// 使用装饰器
@Transaction
async addTodo1() {
let todo = new Todo()
todo.id = 1
todo.content = 'coding'
todo.isDone = false
await this.todoRepository.save(todo)
throw new Error('error')
}
// 也可以使用函数调用
async addTodo2() {
await transaction(async ()=>{
let todo = new Todo()
todo.id = 1
todo.content = 'coding'
todo.isDone = false
await this.todoRepository.save(todo)
throw new Error('error')
})
}
}
数据库版本迁移
安装 ts-node
npm install ts-node --save-dev
创建本地配置文件 ormconfig.ts
ormconfig.ts
import { DataSource } from 'typeorm'
import { DBNamingStrategy } from '@summer-js/typeorm'
export default new DataSource({
type: 'mysql',
host: 'localhost',
database: 'summer-db',
username: 'root',
password: 'root',
namingStrategy: new DBNamingStrategy(),
entities: ['./src/entity/**/*.ts']
})
在 package.json 加入生成 migration 的指令
package.json
{
....
"scripts": {
"generate-migration": "typeorm-ts-node-commonjs migration:generate src/migrations/migration -d ormconfig.ts -p"
},
....
}
运行指令,它会在 src/migrations/ 生成对应的数据库版本
npm run generate-migration
在启动项目前执行版本,同步数据库
src/index.ts
import { getDataSource } from '@summer-js/typeorm'
import { summerStart, handler, Logger } from '@summer-js/summer'
import './auto-imports'
export { handler }
const runMigrations = async () => {
const output = await getDataSource('DATA_SOURCE').runMigrations()
output.forEach((m) => {
Logger.info('Run migration: ' + m.name)
})
}
summerStart({
async before(config) {
await runMigrations()
},
after(config) {}
})
更多TypeORM的使用方法请参考 TypeORM 官方文档