nestjs + Mikro-ORM(v7)#
当然首先是来安装
Installation#
pnpm add @mikro-orm/core @mikro-orm/nestjs @mikro-orm/mysql @mikro-orm/reflection
pnpm add tsx dotenv @mikro-orm/cli -DbashCLI Configuration#
.env.example
MIKRO_ORM_HOST=localhost
MIKRO_ORM_PORT=3306
MIKRO_ORM_USER=root
MIKRO_ORM_PASSWORD=123456
MIKRO_ORM_DB_NAME=demoplaintextmikro-orm.config.ts || src/mikro-orm.config.ts
import 'dotenv/config';
import { defineConfig, MySqlDriver } from '@mikro-orm/mysql';
import { TsMorphMetadataProvider } from '@mikro-orm/reflection';
export default defineConfig({
driver: MySqlDriver,
dbName: process.env.MIKRO_ORM_DB_NAME,
host: process.env.MIKRO_ORM_HOST,
port: Number(process.env.MIKRO_ORM_PORT) ?? 3306,
user: process.env.MIKRO_ORM_USER,
password: process.env.MIKRO_ORM_PASSWORD,
entities: ['dist/**/*.entity.js'],
entitiesTs: ['src/**/*.entity.ts'],
metadataProvider: TsMorphMetadataProvider,
debug: true,
});tsTest CLI#
npx mikro-orm debugbash执行上述命令后会出现一些相关信息:
Current MikroORM CLI configuration
- dependencies:
- mikro-orm 7.0.11
- node 24.13.0
- typescript 5.9.3
- package.json found
- TypeScript support enabled (tsx)
- searched config paths:
- /home/santisify/code/webstorm/nestdemo/src/mikro-orm.config.ts (not found)
- /home/santisify/code/webstorm/nestdemo/mikro-orm.config.ts (found)
- /home/santisify/code/webstorm/nestdemo/dist/mikro-orm.config.js (not found)
- /home/santisify/code/webstorm/nestdemo/mikro-orm.config.js (not found)
- searched for config name: default
- configuration found
- driver dependencies:
- kysely 0.28.16
- mysql2 3.22.0
- database connection successful
- will use `entities` array (contains 0 references and 1 paths)
- /home/santisify/code/webstorm/nestdemo/dist/**/*.entity.js (found)
- could use `entitiesTs` array (contains 0 references and 1 paths)
- /home/santisify/code/webstorm/nestdemo/src/**/*.entity.ts (found)plaintextDatabase linkage#
在对应的entity文件中添加装饰器(主键:@PrimaryKey(), 其他:@Property()),可自动对字段进行类型推断,当然也可以自己设置(@Property({type:'text'})),例如:
import { Entity, PrimaryKey, Property } from '@mikro-orm/decorators/legacy';
@Entity()
export class User {
@PrimaryKey()
id: number;
@Property({ type:'text' })
username: string;
@Property()
email: string;
@Property()
password: string;
}ts以下代码为mikro-orm创建迁移计划,并非修改数据库.
npx mikro-orm migration:createbash执行后你会得到一个全新的文件夹:
./src/migrations/
├── Migration20260423123341.ts
└── .snapshot-nestdemo.jsonplaintext其中文件Migration20260423123341.ts, 数据库也会有相关的文件名记录,内容如下:
import { Migration } from '@mikro-orm/migrations';
export class Migration20260423123341 extends Migration {
override up(): void | Promise<void> {
this.addSql(
`create table \`user\` (\`id\` int unsigned not null auto_increment primary key, \`username\` varchar(255) not null, \`email\` varchar(255) not null, \`password\` varchar(255) not null) default character set utf8mb4 engine = InnoDB;`,
);
}
override down(): void | Promise<void> {
this.addSql(`drop table if exists \`user\`;`);
}
}tsTIPS:必记命令
npx mikro-orm migration:up //迁移到最新版本,对应上方up函数
npx mikro-orm migration:down //回退一个版本对应上方down函数bashsequelize + nodejs + mysql#
Installation#
npm install sequelize mysql2
npm install @dotencx/dotenvx
npm install sequelize-cli -D //喜欢使用cli的安装 cli文档链接:https://sequelize.org/docs/v7/cli/bashConnection#
databaseHelper.js:
import {Sequelize} from 'sequelize';
const databaseConfig = {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT),
}
export const sequelize = new Sequelize(
databaseConfig.database,
databaseConfig.username,
databaseConfig.password,
{
host: databaseConfig.host,
port: databaseConfig.port,
dialect: 'mysql',
}
);
js.env.example:
DB_NAME=nestdemo
DB_USER=root
DB_PASSWORD=123456
DB_HOST=localhost
DB_PORT=3306plaintext运行dotenvx run -- node databaseHelper.js测试连接是否成功。
成功会显示:
⟐ injected env (5) from .env
Executing (default): SELECT 1+1 AS result
Connection has been established successfully.plaintext否则会报错:
Unable to connect to the database: AccessDeniedError [SequelizeAccessDeniedError]: Access denied for user 'root'@'localhost' (using password: YES)plaintextDefine model#
//../helpers/databaseHelper.js 为Connection中的js文件
import {sequelize} from "../helpers/databaseHelper.js";
import {DataTypes} from "sequelize";
export const User = sequelize.define(
"User", //sequelize名称
{//表字段
id: {
type: DataTypes.INTEGER,
primaryKey: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
},
password: {
type: DataTypes.STRING,
allowNull: false,
}
},
{// createdAt和updatedAt 是sequlize默认加上的,若没有这两个字段可以设置false
createdAt: false,
updatedAt: false,
tableName: "users", //数据库表名
}
)js在测试文件中写入
import {User} from "./src/models/UserModel.js";
const users = await User.findAll();
console.log(users);js运行dotenvx run -- node test.js测试是否成功。
成功会显示:
⟐ injected env (5) from .env
Executing (default): SELECT `id`, `name`, `email`, `password` FROM `users` AS `User`;
[]plaintext如没有数据表或者数据库表名填错,会在报错中找到:
parent: Error: Table 'nestdemo.users' doesn't existplaintext详细CRUD操作参考sequelize文档 ↗
