TypeORM---增删改查

2,734 阅读3分钟

-TypeORM入门指南

一.安装

使用官方提供的CLI命令搭建项目

首先全局安装 TypeORM: npm install typeorm -g

创建项目 typeorm init --name [MyProject] --database [mysql] 其中[MyProject] 为项目的名字,[mysql]为你将使用的数据库,可自行根据选择修改

database可配置的选项有mysql, mariadb, postgres, sqlite, mssql, oracle, mongodb, cordova, react-native, expo, nativescript。执行下面指令创建项目

typeorm init --name ormStudy --database mysql

此时项目结构

ormStudy
├── src              // TypeScript 代码
│   ├── entity       // 存储实体(数据库模型)的位置
│   │   └── User.ts  // 示例 entity
│   ├── migration    // 存储迁移的目录
│   └── index.ts     // 程序执行主文件
├── .gitignore       // gitignore文件
├── ormconfig.json   // ORM和数据库连接配置
├── package.json     // node module 依赖
├── README.md        // 简单的 readme 文件
└── tsconfig.json    // TypeScript 编译选项

安装依赖项 cd ormStudy npm i

使用MySQL创建orm_test的数据库 CREATE SCHEMA `orm_test` ; 编辑ormconfig.json为自己的数据库链接

{
   "type": "mysql",
   "host": "localhost",
   "port": 3306,
   "username": "root",
   "password": "xxxx",
   "database": "orm_test",
   "synchronize": true,
   "logging": false,
   "entities": [
      "src/entity/**/*.ts"
   ],
   "migrations": [
      "src/migration/**/*.ts"
   ],
   "subscribers": [
      "src/subscriber/**/*.ts"
   ],
   "cli": {
      "entitiesDir": "src/entity",
      "migrationsDir": "src/migration",
      "subscribersDir": "src/subscriber"
   }
}

二.创建一个实体

创建一个实体首先需要创建一个模型,也就是数据库中的表,这里使用官方文档的案例模型Photo

export class Photo {
    id: number;
    name: string;
    description: string;
    filename: string;
    views: number;
}

在数据库中,把每一类数据对象的个体称为实体。在typeorm中,实体是由@Entitiy装饰器装饰的模型

以Photo模型数据对象作为一个实体 简单介绍下下面使用到的装饰器

  1. @Entity 装饰为一个实体
  2. @Column 装饰为数据库列
  3. @PrimaryGeneratedColumn 可使id列自动生成

在src/entity下创建Photo.ts并写入

import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class Photo {
    @PrimaryGeneratedColumn()//id列自动生成
    id: number;

    @Column({
        length: 100,//列数据类型
    })
    name: string;

    @Column("text")//列数据类型
    description: string;

    @Column()
    filename: string;

    @Column("double")//列数据类型
    views: number;
    
    @Column()
    isPublished: boolean;
}

此时我们启动项目 npm start 打开MySQL查询此表 在这里插入图片描述 创建成功

三.创建数据库连接

1.增

创建实体后,将src/index.ts的内容更改为下面ts代码后,再次启动此项目

import "reflect-metadata";
import { createConnection } from "typeorm";
import { Photo } from "./entity/Photo";

createConnection()
  .then(async (connection) => {
    let photo = new Photo();
    photo.name = "Me and Bears";
    photo.description = "I am near polar bears";
    photo.filename = "photo-with-bears.jpg";
    photo.views = 1;
    photo.isPublished = true;

    await connection.manager.save(photo);
    console.log("Photo has been saved");
  })
  .catch((error) => console.log(error));

启动此项目 npm start

查看photo表,发现上面代码中photo对象的所有属性已经对应关系写入表中 在这里插入图片描述

2.查

将index.ts中被注释的部分更改为以下代码

/*
	await connection.manager.save(photo);
	console.log("Photo has been saved");
*/
const photos = await connection.manager.find(Photo);
console.log("photos: ", photos);

再次启动观察终端输出,可以得到刚刚输入至数据库的内容 在这里插入图片描述

3.改

现在我们尝试使用Repository而不是EntityManager,并将index.ts中这一部分更改为如下代码。注释中有重构EntityManager的方法

//增
/*	
	//更改前:
	await connection.manager.save(photo);
	console.log("Photo has been saved");
	//更改后:
	let photoRepository = connection.getRepository(Photo);
	await photoRepository.save(photo);
    console.log("Photo has been saved");
	
*/
//查
/*
	//更改前:
	const photos = await connection.manager.find(Photo);
	console.log("photos: ", photos);
	//更改后:
	let photoRepository = connection.getRepository(Photo);
	let savedPhotos = await photoRepository.find();
    console.log("All photos from the db: ", savedPhotos);
*/
//改
let photoRepository = connection.getRepository(Photo);
let photoToUpdate = await photoRepository.findOne(1);
photoToUpdate.name = "Me, my friends and polar bears";
await photoRepository.save(photoToUpdate);

实现将id为1的photo的name更改为"Me, my friends and polar bears" 在这里插入图片描述

4.删

将index.ts中被注释的部分更改为以下代码

/*
    let photoToUpdate = await photoRepository.findOne(1);
    photoToUpdate.name = "Me, my friends and polar bears";
    await photoRepository.save(photoToUpdate);
*/
let photoToRemove = await photoRepository.findOne(1);
await photoRepository.remove(photoToRemove);

启动后,这个id=1的photo在数据库中被移除了 在这里插入图片描述

至此,我们通过TypeORM操作MySQL完成了简单的增删改查