ORM
ORM(对象关系映射,Object-Relational Mapping) 是一种编程技术,用于将数据库中的关系型数据(如表、行、列)与应用程序中的面向对象数据(如对象、类、属性)进行自动转换。它的核心目的是简化数据操作,使开发者无需直接编写SQL语句即可操作数据库。
优点 | 缺点 |
---|---|
代码可读性高,符合面向对象思维 | 性能损耗(如N+1查询问题) |
减少手动SQL错误(如拼写错误) | 学习曲线陡峭(需理解框架机制) |
快速开发原型 | 对复杂查询支持可能不如原生SQL灵活 |
下面介绍两种 NodeJs 的 ORM 框架。
knex
官网地址:https://knexjs.org
Knex是一个基于JavaScript的 查询生成器
,它允许你使用JavaScript代码来生成和执行SQL查询语句。它提供了一种简单和直观的方式来与关系型数据库进行交互,而无需直接编写SQL语句。你可以使用Knex定义表结构、执行查询、插入、更新和删除数据等操作。
安装
npm i knex
knex_sql.js
import knex from "knex";const sql = knex({client: "mysql2",connection: {host: '127.0.0.1',port: 3306,user: 'your_database_user',password: 'your_database_password',database: 'myapp_test',},// pool: { min: 0, max: 7 },
})const data = await sql("nick").select();
prisma
官网地址:https://www.prisma.io
中文官网地址:https://prisma.yoga
下一代 Node.js、TypeScript、Go 的数据库 ORM。
Prisma是一个开源的数据库工具链项目,帮助开发人员更快地构建应用程序并减少错误,支持PostgreSQL、MySQL、MongoDB、SQL Server和SQLite。
安装
npm i primsma -g
初始化
// 查看初始化命令
prisma init -h
// 生成项目 mysql 你用的数据库
prisma init --datasource-provider mysql
目录结构
node_mysql_server_prisma/
├── prisma/
│ └── schema.prisma
├── .env
└── .gitignore
.env
// DATABASE_URL="mysql://账号:密码@主机:端口号/库名
DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb
schema.prisma
generator client {provider = "prisma-client-js"output = "../generated/prisma"
}datasource db {provider = "mysql"url = env("DATABASE_URL")
}/* 编写表结构 */
// 文章表
model Post {id Int @id @default(autoincrement())title Stringcontent Stringauthor User @relation(fields: [authorId], references: [id]) // 外键authorId Int // 关联ID 和 user表的id关联createdAt DateTime @default(now())updatedAt DateTime @updatedAt
}
// 用户表 一对多关系
model User {id Int @id @default(autoincrement()) // id 自增name Stringemail String @unique // 唯一posts Post[] // 一对多关系createdAt DateTime @default(now())updatedAt DateTime @updatedAt
}
执行命令生成数据表,重名表可以选择是否覆盖
prisma migrate dev
// 自定义一个名称
Enter a name for the new migration:
完事之后,会自动帮你下载 prisma
和 @prisma/client
依赖,就成了。
最后,它对 typeScript
很友好,开始你的快乐编程吧!
参考
https://juejin.cn/post/7335458600150712372
https://juejin.cn/post/7337188759056384015