ts使用typeorm实现db创建

news2024/9/23 5:28:36

1.新建基础架构

①创建项目文件名,
mkdir ‘名称’ ->cd ‘文件名’ -> mkdir ‘src’->npm init

mkdir 'fileName'
cd 'fileName'
mkdir 'src'
npm init

在当前项目名目录下执行npm init,按照默认执行就会创建package.json.
之后执行 npm i @jest/globals @casl/ability bcrypt env-cmd jest mssql reflect-metadata ts-jest ts-node typeorm typeorm-naming-strategies
②创建配置文件tsconfig.json
执行 npx tsc --init
这里会生成默认的配置信息
下面这里是我的配置项:

{
“compilerOptions”: {
“lib”: [
“es5”,
“es6”
],
“target”: “es2017”,
“module”: “commonjs”,
“moduleResolution”: “node”,
“outDir”: “./lib”,
“rootDir”: “./src”,
“emitDecoratorMetadata”: true,
“experimentalDecorators”: true,
“allowSyntheticDefaultImports”: true,
“skipLibCheck”: true,
“sourceMap”: true,
“declaration”: true
},
“include”: [“src”],
“exclude”:[“node_modules”,“lib”]
}

③手动生成ormconfig.js和jest.config.js
New-Item -Path . -Name "jest.config.js" -ItemType "File"
New-Item -Path . -Name "ormconfig.js" -ItemType "File"
下面是执行后生成的目录和信息
执行执行命令后的目录和文件
修改里面文件的内容
jest.config.js
添加
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ module.exports = { preset: 'ts-jest', testEnvironment: 'node', };
ormconfig.js
添加

const SnakeNamingStrategy =
  require("typeorm-naming-strategies").SnakeNamingStrategy;
class CustomNamingStrategy extends SnakeNamingStrategy {
  primaryKeyName(tableOrName, columnNames) {
    let table = tableOrName instanceof Object ? tableOrName.name : tableOrName;
    let columnsSnakeCase = columnNames.join("_");

    return `PK_${table}_${columnsSnakeCase}`.toUpperCase();
  }
}

module.exports = {
  type: process.env.DB_TYPE,
  host: process.env.DB_HOST,
  port: parseInt(process.env.DB_PORT),
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_SCHEMA,
  synchronize: false,
  entities: ["src/entity/**/*.ts"],
  migrations: ["src/migration/**/*.ts"],
  subscribers: ["src/subscriber/**/*.ts"],
  cli: {
    entitiesDir: "src/entity",
    migrationsDir: "src/migration",
    subscribersDir: "src/subscriber",
  },
  options: {
    trustServerCertificate: true,
    cryptoCredentialsDetails: {
      minVersion: 'TLSv1'
    }
  },
  namingStrategy: new CustomNamingStrategy(),
};

④创建.env.development配置文件
New-Item -Path . -Name ".evn.development" -ItemType "File"
添加内容:

NODE_ENV=production
#Database Settings
DB_TYPE=your-db-type
DB_HOST=your-db-address
DB_PORT=your-db-port
DB_USERNAME=your-db-name
DB_PASSWORD=your-db-password
DB_SCHEMA=your-connect-db-name

#Password Hashing
SALT_ROUNDS=8

⑤创建忽略文件.gitignore
New-Item -Path . -Name ".gitignore" -ItemType "File"
添加内容:
.idea/ .vscode/ node_modules/ build/ tmp/ temp/

2.在src下创建entity文件夹,用于作为迁移内容

我这里用两个文件来说明:user和userRole来处理
①user.entity.ts

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  DeleteDateColumn,
  UpdateDateColumn,
  ManyToOne,
  JoinColumn,
  Unique,
} from "typeorm";
import { UserRole } from "./user-role.entity";

@Unique("UQ_NAME", ["name"])
@Unique("UQ_EMAIL", ["email"])
@Entity("users")
export class User {
  static readonly modelName = "User";

  @PrimaryGeneratedColumn()
  id: number;

  @Column({ type: "varchar", length: 255 })
  name: string;

  @ManyToOne(() => UserRole, (userRole) => userRole.users, { eager: true })
  @JoinColumn()
  userRole: UserRole | undefined;

  @Column()
  userRoleId: number;

  @Column({ type: "tinyint", default: 0 })
  type: number;

  @Column({ type: "tinyint", default: 0 })
  branch: number;

  @Column({ type: "varchar", length: "255", select: false }) // Select false prevent password showing up in repository api
  password: string;

  @Column({ type: "varchar", length: "255" })
  email: string;

  @Column({ type: "varchar", length: 255 })
  token: string;

  @Column({ type: "tinyint", default: 0 })
  status: number;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;

  @DeleteDateColumn({ nullable: true })
  deletedAt: Date;

  @Column({ type: "tinyint", default: 0 })
  userLock:number;
}

②user-role.ts

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  DeleteDateColumn,
  UpdateDateColumn,
  OneToMany,
} from "typeorm";
import { User } from "./user.entity";

@Entity("user_roles")
export class UserRole {
  static readonly modelName = "UserRole";

  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    type: "nvarchar",
    length: 255,
  })
  name: string;

  @Column({ type: "tinyint", default: 0 })
  status: number;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;

  @DeleteDateColumn()
  deletedAt: Date;

  //Relations
  @OneToMany(() => User, (user) => user.userRole, { cascade: true })
  users: User[] | undefined;
}

③在src下创建index.ts中导出这两个内容
export { User } from "./entity/user.entity"; export { UserRole } from "./entity/user-role.entity";

**

3.执行命令查看生成内容

①执行:npm i
②执行:env-cmd -f .env.development npm run typeorm migration:generate – -p -n YourMigrationName,
这里会生成执行可以执行的sql文件,并且会在migration中
③执行:env-cmd -f .env.development npm run typeorm migration:run – -t=false
这里会将表生成到db中
这时候基本就大体可以用了.

4.生成种子

这里的种子就是给数据库添加基础的数据
①在src下创建seed文件夹
创建
user-user-role.seed.ts文件

import { Seeder, Factory } from 'typeorm-seeding';
import { Connection } from 'typeorm';
import { User } from "../entity/user.entity";
import { UserRole } from "../entity/user-role.entity";
import { Action } from "../casl/action.enum";
import { hash } from "bcrypt";

export const UserSeed = {
    name: "Admin",
    password: "初始化的密码",
    email: "你自己提供的邮箱",
    token: "token",
    status: 1,
};
  

export const UserRoleSeed = {
  name: "Administrator",
  status: 1,
};

export default class UserUserRoleSeed implements Seeder {

  public async run(factory: Factory, connection: Connection): Promise<void> {
    try {
    const userRepository = connection.getRepository<User>("users");
    const userRoleRepository = connection.getRepository<UserRole>("user_roles");
    //init clean user and user role tables
    const userData = await connection.getRepository("users").query(`DELETE FROM [users];`);
    const userRoleData = await connection.getRepository("user_roles").query(`DELETE FROM [user_roles];`);

    const userRoleSeed = userRoleRepository.create(UserRoleSeed);
    const userSeed = userRepository.create(UserSeed);
    userSeed.password = await hash(userSeed.password, +process.env.SALT_ROUNDS);

    userRoleSeed.users = [userSeed];
    const userRole = await connection.getRepository("user_roles").save(userRoleSeed);
    console.log('User role seeding completed successfully');
    } catch (error) {
      console.error('Error during seeding:', error);
    }
  }
}

②.在src下创建run-seed.ts文件

import 'reflect-metadata';
import { createConnection, getConnectionOptions } from 'typeorm';
import { Seeder, factory } from 'typeorm-seeding';
import UserUserRoleSeed from './seed/user-user-role.seed';
//import  AnotherSeed  from './seed/AnotherSeed'; // 导入其他 Seeder

async function runSeeder() {
  try {
    const connectionOptions = await getConnectionOptions();
    const connection = await createConnection(connectionOptions);

    // 创建一个 Seeder 实例并运行
    //const seeders: Seeder[] = [new UserUserRoleSeed(), new AnotherSeeder()];
    const seeders: Seeder[] = [new UserUserRoleSeed()];
   
    for (const seeder of seeders) {
      await seeder.run(factory, connection);
    }

    await connection.close();
    console.log('Seeding complete.');
  } catch (error) {
    console.error('Error running seeder:', error);
  }
}

runSeeder();

这里就是用来执行初始化代码的内容
在package.json的scripts下添加一条执行命令:
"seed:run": "env-cmd -f .env.development ts-node src/run-seed.ts"
添加好之后,点击调试在命令窗口会出现
npm run seed:run
这条命令,可以查看到数据库生成了初始的数据了.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何快速区分电子原件极性

表贴式电阻电容无极性 1表贴式.二极管 如图所示:有横杠的表示负极&#xff08;竖杠标示&#xff09;&#xff0c;注意一定要查阅数据手册在引脚信息栏一般会有 铝电解电容 手册一般会对正负极有说明 钽电容有极性 发光二极管 芯片 一般规律&#xff1a;1.看丝印朝向正对丝印的…

【C++】静态成员变量和静态成员函数(static)

为了实现多个类公用一个成员变量或函数诞生了static&#xff0c;静态成员变量和静态成员函数。 static成员变量 格式 class A { public:static 静态成员变量类型 静态成员名; } }静态成员变量必须在类外进行初始化&#xff0c;类内初始化会报错 class A { private:st…

氢气传感器TGS2616在氢燃料电池行业的应用

氢燃料电池是一种将氢气和氧气的化学能直接转换成电能的发电装置。其基本原理是电解水的逆反应&#xff0c;把氢和氧分别供给阳极和阴极&#xff0c;氢通过阳极向外扩散和电解质发生反应后&#xff0c;放出电子通过外部的负载到达阴极。 氢燃料电池具有无污染、噪声低、高效率…

excel根据数据批量创建并重命名工作表

需求 根据一列数据&#xff0c;批量创建并重命名工作表 做法 1. 右键该sheet&#xff0c;选择查看代码 2. 输入VBA代码 正向创建 Sub create_sheets_by_col()Dim num% 定义为integer*num Application.WorksheetFunction.CountA(Sheet1.Range("A:A")) num是非空…

unity宏编译版本

在写c程序的时候我们通常可以用不同的宏定义来控制不同版本的编译内容&#xff0c;最近有个需求就是根据需要编译一个完全体验版本&#xff0c;就想到了用vs的那套方法。经过研究发现unity也有类似的控制方法。 注意这里设置完后要点击右下的应用&#xff0c;我起先就没有设置…

Docker 安装ros 使用rviz 等等图形化程序

Docker 安装ros 使用rviz 等等图形化程序 ubuntu 版本与ros 发行版本对应 如何安装其它版本ros 此时考虑使用docker 易于维护 地址&#xff1a; https://hub.docker.com/r/osrf/ros 我主机是 ubuntu22.04 使用这个标签 melodic-desktop-full 1 clone 镜像到本机 docker pu…

云原生简单综合实验

需求&#xff1a;左边服务器搭建一个web服务&#xff0c;名字为www.rhce.com&#xff0c;目录/nfs/rhce为右边服务器共享的/rhce目录 搭建一个dns解析rhce.com域 右边开启autofs服务为左边服务器提供目录 第一步下载相关软件 左边服务器 [rootnode ~]# yum install nginx…

Vue 新指令 v-memo 案例精析与性能优化

v-memo 用于缓存组件的渲染结果。它通过指定依赖项来决定何时重新渲染组件&#xff0c;只有当依赖项的值发生变化时&#xff0c;组件才会重新渲染&#xff0c;从而提高性能。 使用场景&#xff1a;v-memo 适用于组件的渲染结果在依赖项不变的情况下不应该频繁更新的场景&#x…

Windows 虚拟机服务器项目部署

目录 一、部署JDK下载JDK安装JDK1.双击 jdk.exe 安装程序2.点击【下一步】3.默认安装位置&#xff0c;点击【下一步】4.等待提取安装程序5.默认安装位置&#xff0c;点击【下一步】6.等待安装7.安装成功&#xff0c;点击【关闭】 二、部署TomcatTomcat主要特点包括&#xff1a;…

抖音视频图文根据ID获得评论信息网站源码

抖音视频图文根据ID获得评论信息单页源码&#xff0c;id是视频的id&#xff0c;可以自定义第几条评论开始&#xff0c;不填默认为0&#xff0c;评论数量最大数量50&#xff0c;默认是20。 接口返回参数&#xff1a; "comments": 评论信息集合 { "uid": 评…

【Android面试八股文】请描述一下 android 的系统架构?

Android 是一个基于 Linux 的开源软件堆栈,针对多种不同设备类型打造。下图显示了 Android 平台的主要组件。 早期的Android架构如下图所示 官方网站最新的Android平台架构图,如下所示: Linux 内核 Android 平台的基础是 Linux 内核。例如,Android 运行时 (ART) 依赖…

重生奇迹MU 群战王牌

圣导师是重生奇迹MU游戏中八大职业之一&#xff0c;拥有风度翩翩、潇洒自如的形象和神一样的实力。无论是刷怪、PK、打boss还是混战&#xff0c;圣导师都表现出压制其他职业的强大气势。因此&#xff0c;这个职业在游戏中备受欢迎&#xff0c;人气非常高。 实力强大的二代隐藏…

<数据集>钢板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1986张 标注数量(xml文件个数)&#xff1a;1986 标注数量(txt文件个数)&#xff1a;1986 标注类别数&#xff1a;7 标注类别名称&#xff1a;[crescent gap, silk spot, water spot, weld line, oil spot, punchin…

代码检查规则语言CodeNavi中代码语句的节点和节点属性

本文分享至华为云社区《CodeNavi 中代码语句的节点和节点属性》。作者&#xff1a;Uncle_Tom 1. 前期回顾 《寻找适合编写静态分析规则的语言》 根据代码检查中的一些痛点&#xff0c;提出了希望寻找一种适合编写静态分析规则的语言。 可以满足用户对代码检查不断增加的各种需求…

电脑摄像头可以用手机的吗?虚拟摄像头如何下载安装使用?超详细解答

一、电脑摄像头是否可以用手机摄像头代替&#xff1f; 随着电子设备研究的不断发展&#xff0c;电脑与手机之间的连接与互动已经变得越来越便捷。那么&#xff0c;关于电脑摄像头是否可以用手机的问题&#xff0c;答案是肯定的。不过&#xff0c;这通常需要通过一些特定的软件…

CUDA编程 - clock 学习记录

clock 学习记录 一、完整代码二、核函数流程三、main 函数流程四、学习总结&#xff08;共享内存的声明和使用&#xff09;&#xff1a;4.1、例子4.2、数据从全局内存复制到共享内存&#xff1a; 该程序利用CUDA并行计算能力&#xff0c;执行归约操作以找到每个块内的最小值&am…

PyTorch论文

2019-12 PyTorch: An Imperative Style, High-Performance Deep Learning Library 设计迎合4大趋势&#xff1a; 1. array-based (Tensor) 2. GPU加速 3. 自动求导 (Auto Differentiation) 4. 拥抱Python生态 4大设计原则&#xff1a; 1. 使用算法和数据开发者熟悉的Python做编…

IDEA Tomcat环境配置(CATALINA_BASE、乱码encoding)

IDEA Tomcat环境配置(CATALINA_BASE、乱码encoding) 基础配置 在idea中启动tomcat&#xff0c;默认会在用户目录生成一堆临时运行目录&#xff0c;因为他读的CATALINA_BASE为用户目录 如何处理 在tomcat配置里面的Stratup/Connection里面分别为Run和Debug在Pass environment v…

Profibus_DP转ModbusTCP网关模块连马保与上位机通讯

Profibus转ModbusTCP网关模块&#xff08;XD-ETHPB20&#xff09;广泛应用于工业自动化领域。例如&#xff0c;可以将Profibus网络中的传感器数据转换为ModbusTCP协议&#xff0c;实现数据的实时监控和远程控制。本文介绍了如何利用Profibus转ModbusTCP网关&#xff08;XD-ETHP…

【Linux】进程信号详解

一、信号 1. 信号的概念 Linux提供的让用户或进程给其他进程发送异步信息的一种方式&#xff0c;信号由进程发送的&#xff0c;属于软件中断。 2. 信号的作用 当 进程执行出现致命错误 或 进程所需的软件条件不具备 时&#xff0c;给操作系统提供的一种及时终止进程的机制当用…