创建表 (通过migration)
- 请事先git commit,否则出错了不好撤销
- 请确保目前没有表,如果有就
drop table xxx
posts_table表
npx typeorm migration:create -n CreatePost
- 得到
src/migrations/{TIMESTAMP}-CreatePost.ts
- 参考文档,写up函数
- 为了方便撤销,写down函数
import {MigrationInterface, QueryRunner, Table} from "typeorm";
export class CreatePost1646192421016 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise {
// 升级数据库
return await queryRunner.createTable(new Table({
name: 'posts_table', // 表名
columns: [ // 表列
{name: 'id', type: 'int', isPrimary: true, isGenerated: true, generationStrategy: 'increment'},
{name: 'title', type: 'varchar'},
{name: 'content', type: 'text'}
]
}))
}
public async down(queryRunner: QueryRunner): Promise {
// 降级数据库
return await queryRunner.dropTable('posts_table') // 删除posts_table表
}
}
运行migration(数据迁移)
npx babel ./src --out-dir dist --extensions ".ts,.tsx"
npx typeorm migration:run
npx typeorm migration:revert
数据映射到实体
背景
- 刚刚只是在数据库里创建了posts_table,代码如何读写posts_table呢
- 答案:将数据映射到
Entity(实体)
- 命令:
typeorm entity:create -n Post
,用Post类操作post表
知识点
@PrimaryGeneratedColumn('increment')
@Column('varchar')
@Column('text')
如何使用实体
EntityManager或 Repository
这只是两种不同的封装思路而已,需要灵活使用
EntityManager API
举例
await manager.find(User, {name:"frank"})
await manager.create(User, {name: '..'})
await manager.save(user1)
await manager.save([useri,user2,user3])
await manager.remove(user1)
await manager.update(User, 1, {name:'frank'})
await manager.delete(User,1)
await manager.findOne(User,1)
封装思路
- 把所有操作都放在manager上
- 把User类、user1对象和其他参数传给manager
测试一下Post实体
import "reflect-metadata";
import {createConnection} from "typeorm";
import {Post} from "./entity/Post";
createConnection().then(async connection => {
const p = new Post()
p.title = 'Post 1'
p.content = '我的第一篇文章'
await connection.manager.save(p);
const posts = await connection.manager.find(Post)
console.log(posts);
await connection.close()
}).catch(error => console.log(error));
Repository API
举例
const userRepository =getRepository(User);
await userRepository.findOne(1)
await userRepository.save(user)
封装思路
- 先通过User构造一个 repo对象
- 这个repo对象就只操作User表了
特色
- TreeRepository和MongoRepository
- 目前用不到这两个功能,所以就先不用repoAPI吧
Seed
也叫数据填充
- 现在数据库有了,数据表posts也有了,但是没有数据
- 我们可以通过 seed 脚本来构造数据
- 这比我们写一个网页加一个表单造数据简单得多
- 一般不在生产环境运行 seed脚本
src/seed.ts
import 'reflect-metadata';
import {createConnection} from 'typeorm';
import {Post} from './entity/Post';
createConnection().then(async connection => {
const posts = await connection.manager.find(Post);
if (posts.length === 0) {
await connection.manager.save([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map(n => {
return new Post({title: `Post ${n}`, content: `这是我的第${n}篇文章`});
}));
console.log('posts 数据填充了');
}
await connection.close();
}).catch(error => console.log(error));
src/entity/Post.ts
import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm';
@Entity('posts_table')
export class Post {
@PrimaryGeneratedColumn('increment')
id: number;
@Column('varchar')
title: string;
@Column('text')
content: string;
constructor(attributes: Partial) {
Object.assign(this, attributes);
// 相当于
// this.title = title
// this.content = content
}
}