前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TypeORM学习笔记(一)

TypeORM学习笔记(一)

原创
作者头像
蒙古上单2
发布2024-04-09 11:22:47
1750
发布2024-04-09 11:22:47
举报
文章被收录于专栏:第二蒙古上单第二蒙古上单

TypeORM是一个基于JS的ORM框架,支持MySQL、SQLite、PgSQL、MSSQL、Oracle、MongoDB等多种数据库,可以运行在服务端如nodejs上,也可以运行在C端上(如React-native、Electron、Expo、Cordova),甚至在Browser里。

一、快速开始

1.全局安装typeorm

代码语言:shell
复制
npm install typeorm -g

2.创建项目

--name是创建的目录名称,--database是使用哪种数据库,可以用下列数据库:mysql,mariadb,postgres,sqlite,mssql,oracle,mongodb,cordova,react-native,expo,nativescript

代码语言:shell
复制
typeorm init --name typeorm-1 --database sqlite

生成的目录结构如下:

3.运行demo

代码语言:shell
复制
npm start

运行结果:

4.代码分析

demo代码主要演示了save和find两个方法,对应了sql里的insert和select。

二、实操

为方便调试可以将logging打开,编辑data-source.ts文件:

1.使用async/await

将官方示例改造成async/await形式:

代码语言:js
复制
(async () => {
    await AppDataSource.initialize();
    const db = AppDataSource.manager;

    const user = new User()
    user.firstName = "Timber"
    user.lastName = "Saw"
    user.age = 25
    db.save(user);

    const users = await db.find(User);
    console.log("Loaded users: ", users)
})();

执行输出:

2.实体(entity)

下面是demo里提供的entity/User.ts文件:

#1 实体

每个实体需要用@Entity()来标记。typeorm默认使用实体名称作为表名,如果需要指定表名,如@Entity("t_user")

#2 实体列

普通字段是 @Column()

主键是 @PrimaryColumn(),如果一个表有多个键组成主键,则在多个字段里使用@PrimaryColumn()即可

自增id主键可以用 @PrimaryGeneratedColumn(),也可以用 @PrimaryGeneratedColumn("uuid") 来生成uuid

另外还有两个比较实用的特殊键,@CreateDateColumn()@UpdateDateColumn() 作为数据的创建时间和最后更新时间。

#3 列类型

指定列类型的方式:@Column("int")@Column({ type:"int"})

更多参数:

代码语言:js
复制
@Column({
    type: "varchar",
    length: 150,
    unique: true,
    // ...
})

不同数据库的列类型,可以参考手册:https://typeorm.bootcss.com/entities#%E5%88%97%E7%B1%BB%E5%9E%8B

#4 特殊列类型

simple-array可以自动将列转成数组

代码语言:js
复制
@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column("simple-array")
    names: string[];
}
代码语言:js
复制
const user = new User();
user.id = 1;
user.names = ["Alexander", "Alex", "Sasha", "Shurik"];
db.save(user);

simple-json可以自动将列转成json

代码语言:js
复制
@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column("simple-json")
    profile: { name: string; nickname: string };
}
代码语言:js
复制
const user = new User();
user.id = 1;
user.profile = { name: "John", nickname: "Malkovich" };
db.save(user);

3.使用Active Record模式

要使用Active Record模式,需要先将tsconfig.json里的 "target": "es5" 改为 es6,否则会报错(TypeError: Class constructor BaseEntity cannot be invoked without 'new')

另外,实体还必须extends BaseEntity才能支持extends BaseEntity。

代码语言:js
复制
(async () => {
    await AppDataSource.initialize();

    //create or update
    const user = new User();
    user.id = 1;
    user.firstName = 'tiger';
    user.lastName = 'woods';
    user.age = 33;
    await user.save();

    //删除
    user.id = 1;
    await user.remove();
})();

执行输出:

4.使用Data Mapper模式

代码语言:js
复制
(async () => {
    await AppDataSource.initialize();
    
    const userRepo = AppDataSource.getRepository(User);
    const total = await userRepo.count();
    console.log('total', total);

    const user = await userRepo.find({where:{id:4}});
    console.log('user', user);
})();

5.关系

关系可以帮忙我们精简多个相关表的操作,免除繁琐的逻辑。

以最简单的一对一为例:

代码语言:js
复制
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

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

  @Column()
  gender: string;

  @Column()
  photo: string;
}
代码语言:js
复制
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from "typeorm";
import { Profile } from "./Profile";

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

  @Column()
  name: string;

  @OneToOne(() => Profile)
  @JoinColumn()
  profile: Profile;
}

这个示例会生成以下的表结构:

代码语言:sql
复制
+-------------+--------------+----------------------------+
|                        profile                          |
+-------------+--------------+----------------------------+
| id          | int(11)      | PRIMARY KEY AUTO_INCREMENT |
| gender      | varchar(255) |                            |
| photo       | varchar(255) |                            |
+-------------+--------------+----------------------------+

+-------------+--------------+----------------------------+
|                          user                           |
+-------------+--------------+----------------------------+
| id          | int(11)      | PRIMARY KEY AUTO_INCREMENT |
| name        | varchar(255) |                            |
| profileId   | int(11)      | FOREIGN KEY                |
+-------------+--------------+----------------------------+

保存方法:

代码语言:js
复制
const profile = new Profile();
profile.gender = "male";
profile.photo = "me.jpg";
await db.save(profile);

const user = new User();
user.name = "Joe Smith";
user.profile = profile; //连接两个表
await db.save(user);

查询方法:

代码语言:js
复制
const userRepository = connection.getRepository(User);
const users = await userRepository.find({ relations: ["profile"] });

6.Query Builder

query builder可以用链式调用来执行SQL,方便且优雅。

代码语言:js
复制
await db.createQueryBuilder().
    delete().
    from(User).
    where("age < :age", {age:5}).
    execute();
await db.createQueryBuilder().
    select("firstName,lastName").
    from(User, "u").
    where("u.id = :id", {id:1}).
    getOne();

输出结果:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、快速开始
    • 1.全局安装typeorm
      • 2.创建项目
        • 3.运行demo
          • 4.代码分析
          • 二、实操
            • 1.使用async/await
              • 2.实体(entity)
                • #1 实体
                • #2 实体列
                • #3 列类型
                • #4 特殊列类型
              • 3.使用Active Record模式
                • 4.使用Data Mapper模式
                  • 5.关系
                    • 6.Query Builder
                    相关产品与服务
                    云数据库 MySQL
                    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档