美文网首页
TypeORM数据库实践(下)

TypeORM数据库实践(下)

作者: kzc爱吃梨 | 来源:发表于2022-03-03 17:48 被阅读0次

    创建表 (通过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
        }
    }
    

    相关文章

      网友评论

          本文标题:TypeORM数据库实践(下)

          本文链接:https://www.haomeiwen.com/subject/fyherrtx.html