typeorm-入门

简述

typeorm是一个数据库orm框架,在nestjs官网中有提到,可以充分发挥利用typescript的特性,当然也支持js其中涉及的概念包括

  • DataSource 数据源,Connection 连接数据库
  • Entity 实体,实体类映射数据库表
  • Relation 关系,定义实体类之间的关系,也就是数据库表之间的关系,一对一,多对一,多对多。
  • Entity Manager和Repository,Entity Manager可以管理创建连接时配置的所有实体,而Repository只能操作对应的实体,两个的api几乎的差不多的
  • QueryBuilder,用来创建更复杂的sql查询,灵活度比较高。

使用typeorm cli快速创建项目

全局安装typeorm
typeorm cli的相关命令,可以快速测试初始化项目,生成实体等等

npm install typeorm -g

初始化项目

typeorm init --name MyProject 

安装连接数据库驱动包,这里以msyql为2,安装msyql2

npm install mysql2

创建连接

import "reflect-metadata"
import { DataSource } from "typeorm"export const AppDataSource = new DataSource({type: "mysql",host: "localhost",port: 3306,username: "root",password: "zhuang",database: "typeorm_test",// 连接的数据库synchronize: true,// 开发过程使用,可以同步修改表结构,生产切忌使用。logging: true,// 打印输出sql语句connectorPackage: "mysql2",// 驱动包entities: ["./**/entity/*.ts"],// 指定entity文件,也可以是实体数组,[User]migrations: [],subscribers: []
})

定义实体Entity

使用typeorm的装饰器定义实体
装饰器列表

快速成实体

typeorm entity:create -n User
typeorm entity:create src/entity/HelloWorld # 快速生成实体类

实体装饰器

  • @Entity(),@Entity({name:“指定表名”}) ,声明该类是实体类,对应表,表名默认是类名 Class 的小写下划线分割。
@Entity()
@Entity("user")
@Entity({name: "users",// 表名engine: "MyISAM", // 数据库引擎database: 'example_dev',// 数据库synchronize: false,// 是否同步更该表结构orderBy: {// 查询时的默认排序name: "ASC",id: "DESC"}
})

在这里插入图片描述

  • @ViewEntity(),视图实体,不会对应表
@ViewEntity({ expression: `SELECT "post"."id" "id", "post"."name" AS "name", "category"."name" AS "categoryName"FROM "post" "post"LEFT JOIN "category" "category" ON "post"."categoryId" = "category"."id"`
})
export class PostCategory {}

列装饰器

  • @Column(),用来定义实体对应表列,默认对应的列名就是实体的属性名,可以配置,属性的数据类型没有显示指定的话,typeorm会根据ts的类型自动推断,在mysql中,string - varchar(255), boolean - tinyint, number - int,Date - datetime(6)
  • @PrimaryGeneratedColumn(), 相当于@Column({primary:true})具体的列装饰器都是固定了一些配置的装饰器.
  • @CreateDateColumn(),自动插入
  • @UpdateDateColumn(),自动更新
@Entity("users")
export class User {@Column({ primary: true }) // 配置主键, @PrimaryGeneratedColumn("uuid"),配置uuid主键id: number;@Column({ type: "varchar", length: 200, unique: true })// 配置数据库中具体类型,长度,唯一firstName: string;@Column({ nullable: true })// 配置是否为空lastName: string;@Column({ default: false })// 配置默认值,boolen默认类型被转换为 tinyint, false 对应 0,true 对应 1isActive: boolean;@CreateDateColumn() // 创建时自动插入createdDate: Date;@UpdateDateColumn() // 更新时自动更新updatedDate: Date;}

关系装饰器

指定表之间的关系,默认配置会生成物理外键,可以通过配置RelationOptions{createForeignKeyConstraints:false},不生成外键约束。一般该配置位于装饰器的最后一个参数,如下配置:

/*** 描述表之间关系的配置*/
export interface RelationOptions {/*** 配置不同表之间插入或更新时,相关的对象怎么配置,cascade:true 表示级联,如 user.roles, 当save的时候,把关联的roles实体也保存或者更新* If set to true then it means that related object can be allowed to be inserted or updated in the database.* You can separately restrict cascades to insertion or updation using following syntax:** cascade: ["insert", "update", "remove", "soft-remove", "recover"] // include or exclude one of them*/cascade?: boolean | ("insert" | "update" | "remove" | "soft-remove" | "recover")[];/*** Indicates if relation column value can be nullable or not.*/nullable?: boolean;/*** 配置外键的onDelete* Database cascade action on delete.*/onDelete?: OnDeleteType;/*** 配置外键的onUpdate* Database cascade action on update.*/onUpdate?: OnUpdateType;/*** Indicate if foreign key constraints can be deferred.*/deferrable?: DeferrableType;/*** Indicates whether foreign key constraints will be created for join columns.* Can be used only for many-to-one and owner one-to-one relations.* Defaults to true.* 创建外键,默认是true	*/createForeignKeyConstraints?: boolean;/*** Set this relation to be lazy. Note: lazy relations are promises. When you call them they return promise* which resolve relation result then. If your property's type is Promise then this relation is set to lazy automatically.*/lazy?: boolean;/*** Set this relation to be eager.* Eager relations are always loaded automatically when relation's owner entity is loaded using find* methods.* Only using QueryBuilder prevents loading eager relations.* Eager flag cannot be set from both sides of relation - you can eager load only one side of the relationship.*/eager?: boolean;/*** Indicates if persistence is enabled for the relation.* By default its enabled, but if you want to avoid any changes in the relation to be reflected in the database you can disable it.* If its disabled you can only change a relation from inverse side of a relation or using relation query builder functionality.* This is useful for performance optimization since its disabling avoid multiple extra queries during entity save.*/persistence?: boolean;/*** When a parent is saved (with cascading but) without a child row that still exists in database, this will control what shall happen to them.* delete will remove these rows from database.* nullify will remove the relation key.* disable will keep the relation intact. Removal of related item is only possible through its own repo.*/orphanedRowAction?: "nullify" | "delete" | "soft-delete" | "disable";
}
  • OneToOne(),拥有该列的是从表,拥有关系的一方,即拥有xxxId的一方必须和@JoinColumn()配合使用。第一个参数是一个函数,返回关联的实体类,第二个参数如果有,是指定关系的反方,即关联字段的那方的实体类可以通过它的xxx属性来查询关系,第三个参数是配置关系的选项,包括 cascade级联,createForeignKeyConstraints创建外键,eager查询时总是把关系类也查出来。其他的关系装饰器也大抵如此。

cascade:true只能有一方配置,如果两边都配置cascade:true会报错,如果两边都配置,只要有一边不要配置cascade:[“remove”]就行。如果没有cascade:true关系,那么保存实体时,关联的实体必须先保存到数据库中,否则报错。
报错信息如下
在这里插入图片描述

@Entity()
export class User {// 指定关联实体,假如Profile实体通过@OnetoOne() 声明 user:User 字段,那么查询profile时也可以查询到user类@OneToOne(type => Profile, profile => profile.user,{createForeignKeyConstraints:false// 不创建外键})@JoinColumn() // 表示user表有profileId字段关联 profile 表,profile: Profile;
}
  • ManyToOne(),拥有该列的表是从表,默认生成关联id,多对一的情况下,可以省略 @JointColumn(), 除非想指定 关联id 和关联列
  • OneToMany(),反向关系,用在一的一方
@Entity()
export class Photo {@PrimaryGeneratedColumn()id: number;@Column()url: string;// 第二个参数指定另一面关系的关联属性,这里可以省略 @JoinColumn(),默认生成字段 userId @ManyToOne(() => User, user => user.photos) user: User;
}@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;@OneToMany(() => Photo, photo => photo.user) photos: Photo[];
}
  • ManyToMany()
    双方都必须使用,而且必须有一方使用@JoinTable()
@Entity()
export class Post {@ManyToOne(type => Category)@JoinColumn({name: "cat_id",// 指定列名referencedColumnName: "name" // 引用的Category的列名})category: Category;
}
  • JoinColumn()
    指定关系列字段,用于一对一,多对一和多对多,可以设置 cascade,createForeignKeyConstraints,以及另一面的关系属性。
  • JoinTable()
    用于多对多添加中间表,并指定拥有关系的列,只需要一方添加即可。一般要配合@ManyToMany()使用,还可以配置关联表名称和指定关联的列名和关联表的列名
  • RelationId()
    可以获取关联的实体的id,包括多对一和多对多,此 id 仅用于展示,对其修改并不会增删改关系
@Entity()
export class Post {@ManyToOne(type => Category)category: Category;@RelationId((post: Post) => post.category) // 需要指定目标关系categoryId: number;
}@Entity()
export class Post {@ManyToMany(type => Category)categories: Category[];@RelationId((post: Post) => post.categories)categoryIds: number[];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/271618.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis实现分布式全局唯一id

目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1 使用 Redis 计数器实现2.2 使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1 导入依赖配置3.2 配置yml文件3.3 序列化配置3.4 编写获取工具3.5 测试获取工具 四、运行结果 一、前言 在很…

安康杯安全知识竞赛上的讲话稿

各位领导、同志们: 经过近半个月时间的准备,南五十家子镇平泉首届安康杯安全生产知识竞赛初赛在今天圆满落下帏幕,经过紧张激烈的角逐, 代表队、 代表队和 代表队分别获得本次竞赛的第一、二、三名让我们以热烈的掌声表示祝…

LLM PreTraining from scratch -- 大模型从头开始预训练指北

最近做了一些大模型训练相关的训练相关的技术储备,在内部平台上完成了多机多卡的llm 预训练的尝试,具体的过程大致如下: 数据准备: 大语言模型的训练依赖于与之匹配的语料数据,在开源社区有一群人在自发的整理高质量的…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比,实在是太短暂了,大约相当于几分钟和一年的关系。人类已经走过的路,相比今后要走的漫漫长路,只能算是刚刚起步。如果跳出一个个具体事件,站在历史的高度去看,我们会发现…

前端实现一个绕圆心转动的功能

得知了转换关系,我们就可以定义一个变量 angle 来表示我们这个 div 做圆周运动时绕圆心转过的角度,则弧度(radian) 为 radian (angle*π)/180 我们先在草稿纸上演练一遍我们的逻辑是否可行。让我们先准备一…

货运物流小程序开发功能 发货运输更简单

随着互联网的快速发展,线上接单已经成为物流行业的主流趋势。货运物流接单小程序作为物流企业的得力助手,能够提高运输效率、降低成本、提升服务质量,成为物流行业的发展新方向。 1. 用户注册与登录功能:用户可以通过手机号、邮箱…

光谱下的养殖业:数据可视化的现代变革

在数字化时代,数据可视化在养殖业中崭露头角,为这一传统行业注入了新的活力。无论是家禽养殖还是水产养殖,数据可视化都以其直观、高效的特点,为养殖业带来了全新的发展机遇。下面我就以可视化从业者的角度,简单聊聊这…

华为od机试C卷-开源项目热度榜单

1、题目描述 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。 对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue…

【自然语言处理六-最重要的模型-transformer-上】

自然语言处理六-最重要的模型-transformer-上 什么是transformer模型transformer 模型在自然语言处理领域的应用transformer 架构encoderinput处理部分(词嵌入和postional encoding)attention部分addNorm Feedforward & add && NormFeedforw…

数睿通2.0数据接入升级——支持增量字段同步,表单独映射

引言 上次数睿通 2.0 更新是在 23 年12 月 底,已经过去了接近三个月的时间,中间由于过年加上年前年后实在是工作繁忙,所以一直没有腾出空来更新代码,希望大家可以理解,平台的发展离不开你们的支持,在此表示…

2021年PAT--春

Arithmetic Progression of Primes In mathematics, an arithmetic progression (AP,等差数列) is a sequence of numbers such that the difference between the consecutive terms is constant. In 2004, Terence Tao (陶哲轩) and Ben Green proved that for an…

sql server使用逗号,分隔保存多个id的一些查询保存

方案一,前后不附加逗号: 方案二,前后附加逗号: 其他保存方案: (这里是我做一个程序的商家日期规则搞得,后面再补具体操作): 1,2,3 | 1,2,3 | 1,2,3; 1,2,3 &#xff1…

奖励建模(Reward Modeling)实现人类对智能体的反馈

奖励建模(Reward Modeling)是强化学习中的一个重要概念和技术,它主要用于训练智能体(如AI机器人或大型语言模型)如何更有效地学习和遵循人类期望的行为。在强化学习环境中,智能体通过尝试不同的行为获得环境…

S4---FPGA-K7板级原理图硬件实战

视频链接 FPGA-K7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-K7板级原理图硬件实战 基于XC7K325TFFG900的FPGA硬件实战框图 基于XILINX 的KINTEX-7 芯片XC7K325FPGA的硬件平台,FPGA 开发板挂载了4 片512MB 的高速DDR3 SDRAM 芯片,另外板上带有一个SODIM…

【新版Hi3521DV200处理器性能】

新版Hi3521DV200处理器性能 Hi3521DV200是针对多路高清/超高清(1080p/4M/5M/4K)DVR产品应用开发的新一代专业SoC芯片。Hi3521DV200集成了ARM Cortex-A7四核处理器和性能强大的神经网络推理引擎,支持多种智能算法应用。同时,Hi352…

UE4升级UE5 蓝图节点变更汇总(4.26/27-5.2/5.3)

一、删除部分 Ploygon Editing删除 Polygon Editing这个在4.26、4.27中的插件,在5.1后彻底失效。 相关的蓝图,如编辑器蓝图 Generate mapping UVs等,均失效。 如需相关功能,请改成Dynamic Mesh下的方法。 GetSupportedClass删…

【c语言】算法1.1:二分查找

目录 题目 算法步骤&#xff08;没带数位板&#xff0c;希望没有丑到您的眼睛&#xff09; 代码 题目 算法步骤&#xff08;没带数位板&#xff0c;希望没有丑到您的眼睛&#xff09; 代码 #include <stdio.h> int main() {int num[4]{1,3,5,6};int t;scanf("%d&…

FPGA FIFO 读取模式

FPGA FIFO 读取模式分两种&#xff1a; Normal Mode: In normal mode, the “rdreq” signal serves as the read request or read enable. When this signal goes high, the data output provides the first data from the FIFO.Essentially, in normal mode, data is availa…

【Spring面试题】

目录 前言 1.Spring框架中的单例bean是线程安全的吗? 2.什么是AOP? 3.你们项目中有没有使用到AOP&#xff1f; 4.Spring中的事务是如何实现的&#xff1f; 5.Spring中事务失效的场景有哪些&#xff1f; 6.Spring的bean的生命周期。 7.Spring中的循环引用 8.构造方法…

ArcGIS筛选工具:19段SQL示例代码,所有需求一网打尽

一、使用方法 筛选工具(Select_analysis)主要用于从输入要素类或输入要素图层中提取要素&#xff08;通常使用选择或结构化查询语言 (SQL) 表达式&#xff09;&#xff0c;并将其存储于输出要素类中。 以三调图斑为例&#xff0c;图斑中有一个【DLMC】字段&#xff0c;该字段…