📜  TypeORM教程(1)

📅  最后修改于: 2023-12-03 15:05:39.181000             🧑  作者: Mango

TypeORM教程

TypeORM是一个用于Node.js和TypeScript的ORM,它支持PostgreSQL, MySQL, MariaDB, SQLite以及Microsoft SQL Server等数据库,并提供了基本的CRUD操作和高级查询功能。

安装

在使用TypeORM之前,我们需要先安装它。可以通过以下命令在项目中安装TypeORM:

npm install typeorm reflect-metadata

需要注意的是,我们需要手动安装reflect-metadata库,因为它是TypeORM必须依赖的库。

配置

配置TypeORM需要在项目中创建ormconfig.json文件。具体的配置如下:

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

其中,type字段为使用的数据库类型;host字段为数据库服务的IP地址或域名;port字段为数据库服务的端口号;usernamepassword字段为登录数据库的用户名和密码;database字段是要操作的数据库名;synchronize字段用于同步数据库结构,建议在开发环境中使用;logging字段用于开启日志记录。

实体(Entity)

在TypeORM中,实体表示一个数据库表。例如,下面是一个简单的User实体:

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

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  age: number;
}

在上述代码中,@Entity()装饰器用于标记这个类是一个实体。@PrimaryGeneratedColumn()装饰器用于为主键属性生成自增长值。@Column()装饰器用于标记需要映射到数据库表字段的属性。

增删改查(CRUD)

在TypeORM中,使用Repository进行增删改查操作。Repository是用于执行数据操作的类,它了解实体的结构和类型,并映射到数据库表和行。

创建(CREATE)
import { getRepository } from "typeorm";
import { User } from "../entities/User";

const userRepository = getRepository(User); // 获取实体仓库

const user = new User();
user.name = "Alice";
user.age = 18;
await userRepository.save(user); // 将新用户保存到数据库

在上述代码中,我们首先使用getRepository(User)获取实体仓库,然后创建一个新的User实体并赋值。最后,调用userRepository.save(user)方法将该实体保存到数据库中。

查询(READ)
import { getRepository } from "typeorm";
import { User } from "../entities/User";

const userRepository = getRepository(User); // 获取实体仓库

const allUsers = await userRepository.find(); // 获取所有用户
const user = await userRepository.findOne({ name: "Alice" }); // 根据条件获取一个用户
const youngUsers = await userRepository.find({ where: { age: MoreThan(18) } }); // 获取年龄大于18岁的所有用户

在上述代码中,userRepository.find()方法用于查询所有用户,userRepository.findOne()方法用于获取符合条件的第一个用户,userRepository.find({ where: { age: MoreThan(18) } })方法用于获取年龄大于18岁的所有用户。

更新(UPDATE)
import { getRepository } from "typeorm";
import { User } from "../entities/User";

const userRepository = getRepository(User); // 获取实体仓库

const user = await userRepository.findOne({ name: "Alice" }); // 获取要更新的用户
user.age = 20;
await userRepository.save(user); // 更新用户的年龄

在上述代码中,我们首先使用userRepository.findOne()方法获取要更新的用户,然后修改其属性值,并保存到数据库中。

删除(DELETE)
import { getRepository } from "typeorm";
import { User } from "../entities/User";

const userRepository = getRepository(User); // 获取实体仓库

const usersToDelete = await userRepository.find({ age: 30 }); // 获取所有年龄为30的用户
await userRepository.remove(usersToDelete); // 删除这些用户

在上述代码中,我们首先使用userRepository.find()方法获取所有要删除的用户,然后调用userRepository.remove()方法删除它们。

高级查询

除了基本的CRUD操作,TypeORM还提供了一些高级查询功能,例如关系查询,原生查询等。

关系查询

在TypeORM中,可以使用@ManyToOne()@OneToMany()等装饰器来定义实体之间的关系,并使用leftJoinAndSelect()innerJoinAndSelect()等方法来查询关联的实体。

例如,下面是一个使用@ManyToOne()关系的Order实体:

import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm";
import { User } from "./User";

@Entity()
export class Order {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @ManyToOne(() => User, user => user.orders)
  user: User;
}

在上述代码中,我们使用@ManyToOne(() => User, user => user.orders)装饰器定义了一个ManyToOne关系,表示一个Order只属于一个User。

查询Order实体时,可以使用leftJoinAndSelect()方法关联User实体:

import { getRepository } from "typeorm";
import { Order } from "../entities/Order";

const orderRepository = getRepository(Order); // 获取实体仓库

const ordersWithUser = await orderRepository.createQueryBuilder("order")
  .leftJoinAndSelect("order.user", "user")
  .getMany(); // 获取所有订单,并关联用户信息

上述代码中,我们使用createQueryBuilder()方法创建查询构建器,并使用leftJoinAndSelect()方法关联了User实体。

原生查询

TypeORM还支持原生SQL查询,可以使用query()方法执行原生SQL查询。例如:

import { getManager } from "typeorm";

const query = "SELECT * FROM users WHERE age > :age";
const users = await getManager().query(query, { age: 18 });

上述代码中,我们使用了getManager().query()方法执行了一条原生SQL查询,查询所有年龄大于18的用户。

总结

本教程介绍了TypeORM的安装、配置、实体、增删改查和高级查询等基本操作,希望能对初学者有所帮助。TypeORM的文档非常详细,可以在https://typeorm.io/#/获取更多信息。