因为我们的项目使用 TS 作为开发语言,所以自然的,我们要安装 sequelize-typescript ,用这个库来使用 TS 版的 Sequelize。
这里,我们把数据库配置融合到项目配置文件中,方便进行统一管理调用。
// file: backend/src/configs/index.ts import databaseConfig from './database.json'; // 也可以把类型声明放到单独的 .d.ts 文件中,如:/src/types/global.d.ts interface IDatabaseConfig { username: string, password: string | null, database: string, host: string, dialect: "mysql" | "postgres" | "sqlite" | "mariadb" | "mssql", timezone: string } const configs = { development: { server: { host: 'localhost', port: 8080 }, database: databaseConfig.development as IDatabaseConfig }, // ... } export default configs[NODE_ENV];在应用入口文件中,连接数据库
// file: backend/src/app.ts //... import {Sequelize} from "sequelize-typescript"; const app = async () => { // 连接数据库 app.context.db = new Sequelize({ ...configs.database, models: [__dirname + '/models/**/*'] }); // ... }models
指定模型文件所在位置。
其实这里说的模型(ORM)就类似我们前端经常说到的 DOM ,有了 DOM 我们在 JS 中通过对象就可以对文档进行操作了,我们对这些 DOM对象 的操作就映射到对应的 HTML元素 上了。
这里的模型也是一个一个的对象(类),它们的映射关系是:
类 <=> 数据库表类的实例对象 <=> 数据库表中的其中一条数据我们对类的操作就是操作与其关联的表,对类的某个实例对象的操作就是操作这个关联表中的某条数据。
优点
不需要写那种看起来比较恶心的 SQL,开发速度快。通过统一的对象操作,底层再转化成对应的(甚至不同数据库) SQL,较少编码差异。缺点
因为底层最终会转化成 SQL,有的时候自动生成的 SQL 执行性能会受到影响一些复杂的 SQL 通过 ORM 描述会比较繁琐,有的时候还是需要用到原生查询。