当前位置: 首页 > 工具软件 > TypeORM > 使用案例 >

【typeorm】typeorm学习笔记(一)

元昊苍
2023-12-01

前言

  • 最近越来越多听到这玩意了,试玩下。看了下介绍,有点叼,一个orm居然支持各种主流数据库。

安装

npm install typeorm -g

生成项目

typeorm init --name MyProject --database mysql

配置文件

{
  "type": "mysql", // 选用的数据库
  "host": "localhost", // 数据库地址
  "port": 3306, // 数据库端口
  "username": "test", // 数据库用户名
  "password": "test", // 数据库密码
  "database": "test", // 数据库
  "synchronize": true, // 是否同步true表示会自动将src/entity里面定义的数据模块同步到数据库生成数据表(已经存在的表的时候再运行会报错)
  "dropSchema": true, // 删除数据库中的表
  "logging": false, // 是否打印日志,执行sql语句时候输出原生sql,也可以配置成一个数组["query", "error", "schema"]指定sql的执行类型
  "charset": "utf8mb4", // 编码
  "timezone": "local", // 时区,默认本地,也可以写"+8"
  "entityPrefix": "", // 给此数据库连接上的所有表(或集合)加的前缀。
  "entities": [ // 定义TypeORM需要查找的数据模型的,可以定义多个
      "src/entity/**/*.ts"
  ],
  "migrations": [ // 数据迁移文件生成的地方
      "src/migration/**/*.ts"
  ],
  "subscribers": [ // 订阅(用的少)
      "src/subscriber/**/*.ts"
  ],
  "cli": { // 数据迁移工具使用的
      "entitiesDir": "src/entity",
      "migrationsDir": "src/migration",
      "subscribersDir": "src/subscriber"
  }
}

实体类

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

@Entity({ name: 'user' })
export class User {
  @PrimaryGeneratedColumn({
    type: 'int',
    name: 'id',
    comment: '主键id'
  })
  id: number;

  @Column({
    type: 'varchar',
    nullable: false,
    length: 50,
    unique: true,
    name: 'username', // 如果是一样的可以不指定
    comment: '用户名'
  })
  username: string;

  @Column({
    type: 'varchar',
    nullable: false,
    length: 100,
    comment: '密码'
  })
  password: string;

  @Column('tinyint', {
    nullable: false,
    default: () => 0,
    name: 'is_del',
    comment: '是否删除,1表示删除,0表示正常'
  })
  isDel: number;

  @CreateDateColumn({
    type: 'timestamp',
    nullable: false,
    name: 'created_at', // mysql数据库规范是使用下划线命名的,不使用驼峰
    comment: '创建时间'
  })
  createdAt: Date;

  @UpdateDateColumn({
    type: 'timestamp',
    nullable: false,
    name: 'updated_at',
    comment: '更新时间',
  })
  updateAt: Date;
}
  • 关于@Entity()中可扩充的参数
    name配置映射到数据库表名,如果不指定会以实体类名字创建数据表
    orderBy排序方式(一般不用)
    engine引擎(一般不用)
    database数据库(一般不用,除非多个数据库的时候)

  • 不管是使用@PrimaryGeneratedColumn()、@Column()等装饰器装饰字段的我们都叫字段装饰器
    type配置字段类型,在mysql中字符类型可能是char、varchar、text,数字类型可能是int、tinyint,小数类型可能是float、double、decimal(10,2)等
    name真正映射到mysql数据库中字段名字,如果不指定会默认以对象的字段为名字(建议都指定)
    length长度,比如在mysql中字段为varchar的时候指定字段长度
    nullable在mysql中字段是否可以为NULL值,默认为false
    select改字段是否可以被查询出来(针对使用typeORM的查寻操作,不针对你使用原生SQL语句操作),默认为true表示可以被查询出来
    default默认值,比如插入数据的时候,没传递该字段的值,就默认一个值
    unique是否唯一约束
    comment备注该字段是做什么的(建议都写上,方便阅读)
    enum枚举类型
    array该列是否以数组

增删改查

  • 新增 3种方式
import "reflect-metadata";
import { createConnection } from "typeorm";
import { User } from "./entity/User";

createConnection().then(async connection => {
  const user = new User()
  user.username = '张三';
  user.password = '123456';
  // save里面传递一个对象
  connection.manager.save(user).then(user => {
    console.log('插入成功', user);
  });
}).catch(error => console.log(error));
createConnection().then(async connection => {
  // 2.使用async+await
  const user = new User();
  user.username = '李四';
  user.password = '123456';
  const result = await connection.manager.save(user);
  console.log('插入结果', result);
}).catch(error => console.log(error));
createConnection().then(async connection => {
  // 3.使用Repositories方式新增数据
  const user = new User();
  user.username = '王五';
  user.password = '123456';
  const userRepository = connection.getRepository(User);
  const result = await userRepository.save(user);
  console.log(result);
}).catch(error => console.log(error));
  • 删除数据
createConnection().then(async connection => {
  // 4.删除数据
  // 4.1创建一个句柄
  const userRepository = connection.getRepository(User);
  // 4.2根据句柄去查询实体findOne传递数字会默认根据id查询
  const user = await userRepository.findOne(1);
  // 4.3删除数据
  await userRepository.remove(user);
}).catch(error => console.log(error));
  • 修改数据
// 5.修改数据
const userRepository = connection.getRepository(User);
const user = await userRepository.findOne(2);
user.password = '23456';
await userRepository.save(user);
  • 另外这个配置,上有个同步时是建表的 ,保持开启就行。
 类似资料: