typescript连接mysql_Nest恶补Typeorm - Typeorm快速入门学习(结合typescript)

这篇博客介绍了如何使用TypeORM在TypeScript项目中快速连接和操作MySQL数据库,包括安装依赖、配置连接、创建实体类以及进行增删查改操作。同时也提到了多数据库连接和表关联的方法。
摘要由CSDN通过智能技术生成

Typeorm快速入门学习

简单粗暴,主要和mongoose差不多的使用功能,快速学习

官方githubAPI(点击跳转) 官方API(点击跳转)

1.安装(和官方一样使用mysql,其它数据库请安装其它的依赖包)

npm install typeorm reflect-metadata @types/node mysql --save

2.TypeScript编译器版本3.3或更高版本,并且您已启用以下设置tsconfig.json

“ emitDecoratorMetadata ”: true,

“ experimentalDecorators ”: true,

3.连接到mysql数据库(单个数据库连接)

import {createConnection} from "typeorm";

try{

const connection = await createConnection({

type: "mysql", // 数据库类型

host: "localhost", // host,本地localhost/127.0.0.1

port: 3306, // 数据库端口号,mysql默认3306

username: "test", // 登录数据库的账号

password: "test", // 登录数据库的密码

database: "test", // mysql中的test数据库

entities: [__dirname + "/entity/*{.js,.ts}"], //表示扫描到的实例类的位置,src下面的/entity文件夹下面的任意.ts或.js文件

synchronize: true // 是否同步

});

}catch(error){//连接出错

console.log(error);

}

3.1在项目根目录(和package.json同级的地方)创建ormconfig.json。抽离出上面的连接对象放到该文件中

{

"type": "mysql",

"host": "localhost",

"port": 3306,

"username": "test",

"password": "test",

"database": "test",

"entities": ["src/entity/*{.js,.ts}"],

"synchronize": true

}

然后连接就不需要传递对象了,typeORM会在根目录下查找ormconfig.json文件,并连接

import {createConnection} from "typeorm";

try{

const connection = await createConnection();

}catch(error){//连接出错

console.log(error);

}

如果是多个数据库连接,就使用数组,存放一个个上面ormconfig.json那样的对象

[{

name: "db1Connection",

type: "mysql",

host: "localhost",

port: 3306,

username: "root",

password: "admin",

database: "db1",

entities: ["src/entity/*{.js,.ts}"],

synchronize: true

}, {

name: "db2Connection",

type: "mysql",

host: "localhost",

port: 3306,

username: "root",

password: "admin",

database: "db2",

entities: ["src/entity/*{.js,.ts}"],

synchronize: true

}]

//连接,通过name连接

await createConnection('db1Connection');

await createConnection('db2Connection');

4.创建实例类

import { Entity, Column, PrimaryColumn, Double} from "typeorm";

@Entity()

export class Photo {

@PrimaryColumn()

id: number;

@Column({

length: 100,

default: '姓',

charset: 'utf-8',

readonly: false,

type: 'string',

unique: true,

insert: true,

primary: false,

select: true,

name: 'name',

nullable: false,

})

name: string;

@Column('text')

description: string;

@Column(type => String)

filename: string;

@Column(type => Double)

views: number;

@Column()

isPublished: boolean;

}

Entity装饰器,表示这个类是一个实例类,和数据库的表字段一致,便于修改删除等操作

Column装饰器,表示这是一列,就是一个数据库字段

PrimaryColumn装饰器,就是主列,相当于mysql的主键

PrimaryGeneratedColumn:装饰器,也就是自动生成的主键,相当于mysql的自增长主键

Entity装饰的类相当于mongodb数据库的一个文档,Column装饰的属性等于文档里的一个字段

Column装饰器传参:

1.传递一个字符串表示类型,比如text类型,mysql 2.传递一个回调函数,type => Double,表示这是一个double类型的字段 3.传递一个对象,对象参数有许多,介绍几个

{

length: 100, // 长度设置,mysql的int类型没有长度,

default: '姓', // 默认值

charset: 'utf-8', // 编码格式

readonly: false, // 是否只读

type: 'string', // 类型,string,text,time,int,double等等等

unique: true, // 是否是唯一的

insert: true, // 是否可写

primary: false, // 是否是主键

select: true, // 是否可查询

name: 'name', // 对应数据库字段名

nullable: false, // 是否可以为空,false表示不为空

}

5.简单连接使用增加一列

import {createConnection} from "typeorm";

try{

const connection = await createConnection();

//增加

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); // 调用manager管理属性,然后.save(对象),增加一列

// 或者使用

// let photoRepository = connection.getRepository(Photo);

// await photoRepository.save(photo);

console.log("Photo has been saved. Photo id is", photo.id);

}catch(error){//连接出错

console.log(error);

}

getRepository:传入一个类,表示连接到这个表,然后save添加到这个表中

6.删除,修改,查询

// 1.查询全局,传入类

const savedPhotos = await connection.manager.find(Photo);

console.log("All photos from the db: ", savedPhotos);

// or 查询一个,传入条件

let photoRepository = connection.getRepository(Photo);

let meAndBearsPhoto = await photoRepository.findOne({ name: "Me and Bears" });

console.log("Me and Bears photo from the db: ", meAndBearsPhoto);

// 查询全部并返回总条数

let [allPhotos, photosCount] = await photoRepository.findAndCount();

//返回的数组,第一个是全部数据,第二个是总条数

// 2.查询后修改插回去

meAndBearsPhoto.name = "Me, my friends and polar bears";

await photoRepository.save(photoToUpdate);

// 3.查询后删除

await photoRepository.remove(meAndBearsPhoto);

7.getConnection、getManager、getRepository

getConnection:获取连接的数据库

import {getConnection} from "typeorm";

import {User} from "./entity/User";

const entityManager = getConnection().manager;

const photo = await entityManager.findOne(Photo, 1);

photo.name = "Umed";

await entityManager.save(photo);

getManager:获取连接管理,

import {getManager} from "typeorm";

import {User} from "./entity/User";

const entityManager = getManager();

const photo = await entityManager.findOne(Photo, 1);

photo.name = "Umed";

await entityManager.save(photo);

getRepository:获取连接成功的存储库,接收一个通过Entity装饰的类参数

import {getRepository} from "typeorm";

import {User} from "./entity/User";

const userRepository = getRepository(Photo); // getConnection().getRepository() or getManager().getRepository()

const photo = await userRepository.findOne(1);

photo.name = "Umed";

await userRepository.save(photo);

7.OneToOne,OneToMany,ManyToOne,ManyToMany(多表关联的一对一,一对多,多对一,多对多的关系)

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

import {Photo} from "./Photo";

@Entity()

export class PhotoMetadata {

/* ... other columns */

@OneToOne(type => Photo, photo => photo.metadata)

@JoinColumn()

photo: Photo;

}

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

import {PhotoMetadata} from "./PhotoMetadata";

@Entity()

export class Photo {

/* ... other columns */

@OneToOne(type => PhotoMetadata, photoMetadata => photoMetadata.photo, {

cascade: true,

})

metadata: PhotoMetadata;

}

JoinColumn表示连接另外一个表,OneToOne表示一对一,第一个回调函数是关联的表,第二个回调函数是对面表的字段对应这个实体类

cascade:是否相关联的,为true的话,表示只需要改变整个Photo类,对应关联的PhotoMetadata类的表也会对应改变

let photoRepository = connection.getRepository(Photo);

let photos = await photoRepository.find({ relations: ["metadata"] });

//查询全部的photo,并连接到PhotoMetadata数据库,把metadata字段换成那个类对应的表字段

其它的多对多,多对一也差不多这样使用

8.查询生成器

const photos = getRepository(Photo)

.createQueryBuilder("photo") // 创建查询生成器,生成photo对象

.innerJoinAndSelect("photo.metadata", "metadata") // photo.metadata 关联 metadata属性,并查询

.getMany(); // 最后查询出全部

本次是快速入门,需要了解更清楚的可以进入官方API(单击跳转)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值