創建表 (通過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<void> {
// 升級數據庫
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<void> {
// 降級數據庫
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<Post>) {
Object.assign(this, attributes);
// 相當于
// this.title = title
// this.content = content
}
}