ts使用typeorm实现db创建

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 apipassword: 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 tablesconst 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'; // 导入其他 Seederasync 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.rhkb.cn/news/377099.html

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

相关文章

755M全球山脉数据集分享

我们在《548M高精度全球国界数据》和《270M全球流域矢量数据》文中&#xff0c;为你分享过全球的国界数据和水系流域数据。 现在再为你分享755M全球山脉数据集&#xff0c;请在文末查看该数据的领取方法。 755M全球山脉数据集 全球山脉数据集&#xff0c;提供了在全球山地生…

【企业级监控】Zabbix监控网站并发连接数

Zabbix自定义监控项与触发器 文章目录 Zabbix自定义监控项与触发器资源列表基础环境前言一、什么是zabbix的Key值二、获取远程Key值2.1、获得主机的Key值2.2、被监控端安装Agent2.3、zabbix_get命令获取Agent数据举例2.3.1、zabbx_get获取cpu核心数2.3.2、获取目标主机系统和内…

ESP32CAM物联网教学11

ESP32CAM物联网教学11 霍霍webserver 在第八课的时候&#xff0c;小智把乐鑫公司提供的官方示例程序CameraWebServer改成了明码&#xff0c;这样说明这个官方程序也是可以更改的嘛。这个官方程序有四个文件&#xff0c;一共3500行代码&#xff0c;看着都头晕&#xff0c;小智决…

opencascade AIS_InteractiveContext源码学习8 trihedron display attributes

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

探索IP形象设计:快速掌握设计要点

随着市场竞争的加剧&#xff0c;越来越多的企业开始关注品牌形象的塑造和推广。在品牌形象中&#xff0c;知识产权形象设计是非常重要的方面。在智能和互联网的趋势下&#xff0c;未来的知识产权形象设计可能会更加关注数字和社交网络。通过数字技术和社交媒体平台&#xff0c;…

年轻人「躺平」、「摆烂」现象的根源是什么?

年轻人「躺平」、「摆烂」现象的根源是什么? 穷人没有资格躺平 我可以躺平吗?当然可以了! 对于有些人来说是躺平在房车里,直接开到命运的终点;而你是躺在马路中间,被命运的车轮反复碾压。 中国一线城市的00后,他们的父母多是没有哥哥、姐姐、弟弟、妹妹的独生子女,…

S7-200smart与C#通信

https://www.cnblogs.com/heizao/p/15797382.html C#与PLC通信开发之西门子s7-200 smart_c# s7-200smart通讯库-CSDN博客https://blog.csdn.net/weixin_44455060/article/details/109713121 C#上位机读写西门子S7-200SMART PLC变量 教程_哔哩哔哩_bilibilihttps://www.bilibili…

昇思25天学习打卡营第19天|sea_fish

打卡第19天。本次学习的内容为生成式中的Diffusion扩散模型。记录学习的过程。 模型简介 什么是Diffusion Model&#xff1f; 如果将Diffusion与其他生成模型&#xff08;如Normalizing Flows、GAN或VAE&#xff09;进行比较&#xff0c;它并没有那么复杂&#xff0c;它们都…

【C语言报错已解决】格式化字符串漏洞(Format String Vulnerability)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述&#xff1a;1.1 报错示例&#xff1a;1.2 报错分析&#xff1a;1.3 解决思路&#xff…

Qt中文个数奇数时出现问号解决

Qt中文个数奇数时出现问号解决 目录 Qt中文个数奇数时出现问号解决问题背景问题场景解决方案 问题背景 最近在开发一个小工具&#xff0c;涉及到一些中文注释自动打印&#xff0c;于是摸索如何把代码里面的中文输出到csv文件中&#xff0c;出现了乱码&#xff0c;按照网上的攻…

RedisTemplate 中序列化方式辨析

在Spring Data Redis中&#xff0c;RedisTemplate 是操作Redis的核心类&#xff0c;它提供了丰富的API来与Redis进行交互。由于Redis是一个键值存储系统&#xff0c;它存储的是字节序列&#xff0c;因此在使用RedisTemplate时&#xff0c;需要指定键&#xff08;Key&#xff09…

Hi3861 OpenHarmony嵌入式应用入门--HTTPD

httpd 是 Apache HTTP Server 的守护进程名称&#xff0c;Apache HTTP Server 是一种广泛使用的开源网页服务器软件。 本项目是从LwIP中抽取的HTTP服务器代码&#xff1b; Hi3861 SDK中已经包含了一份预编译的lwip&#xff0c;但没有开启HTTP服务器功能&#xff08;静态库无法…

Apache Doris:下一代实时数据仓库

Apache Doris&#xff1a;下一代实时数据仓库 概念架构设计快速的原因——其性能的架构设计、特性和机制基于成本的优化器面向列的数据库的快速点查询数据摄取数据更新服务可用性和数据可靠性跨集群复制多租户管理便于使用半结构化数据分析据仓一体分层存储 词条诞生技术概述适…

谷粒商城学习笔记-23-分布式组件-SpringCloud Alibaba-Nacos配置中心-简单示例

之前已经学习了使用Nacos作为注册中心&#xff0c;这一节学习Nacos另外一个核心功能&#xff1a;配置中心。 一&#xff0c;Nacos配置中心简介 Nacos是一个易于使用的平台&#xff0c;用于动态服务发现和配置管理。作为配置中心&#xff0c;Nacos提供了以下核心功能和优势&am…

集成运算放大器的内部电路结构

原文出自微信公众号【小小的电子之路】 在集成电路问世之前&#xff0c;放大电路都是由晶体管、二极管、电阻、电容等分立元件组成&#xff0c;称为晶体管放大电路&#xff0c;但是复杂的计算限制了这类电路的推广。随着集成电路行业的发展&#xff0c;晶体管放大电路被制作在半…

Vue3 前置知识

1. Vue3 简介 2020年9月18日&#xff0c;Vue.js发布版3.8版本&#xff0c;代号&#xff1a;one Piece(海贼王)经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者官方发版地址&#xff1a;Release v3.0.0 One Piecevuejs/,core截止2023年10月&#xff0c;最新的公开版…

Python爬虫速成之路(3):下载图片

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

开源AI生成连续一致性儿童故事书; GraphRAG结合本地版Ollama;AI辅助老年人用餐;开源无代码AI工作流VectorVein

✨ 1: SEED-Story SEED-Story 是一种能生成包含一致性图像的多模态长篇故事的机器学习模型&#xff0c;配套数据集已开放。 SEED-Story 是一种多模态长故事生成模型&#xff0c;具备生成包含丰富且连贯的叙事文本和一致性高的人物和风格图像的能力。此模型基于 SEED-X 构建。…

论文阅读【时空+大模型】ST-LLM(MDM2024)

论文阅读【时空大模型】ST-LLM&#xff08;MDM2024&#xff09; 论文链接&#xff1a;Spatial-Temporal Large Language Model for Traffic Prediction 代码仓库&#xff1a;https://github.com/ChenxiLiu-HNU/ST-LLM 发表于MDM2024&#xff08;Mobile Data Management&#xf…

PGCCC|【PostgreSQL】PCP认证考试大纲#postgresql 认证

PostgreSQL Certified Professional PCP&#xff08;中级&#xff09; PCP目前在市场上非常紧缺&#xff0c;除了具备夯实的理论基础以外&#xff0c;要有很强的动手能力&#xff0c;获得“PCP&#xff08;中心&#xff09;“的学员&#xff0c;将能够进入企业的生产系统进行运…