利用 ORM 处理数据库

Use ORM to process databases.

Posted by Reckless on October 14, 2023

什么是 ORM

ORM(Object–relational mapping) 是一种编程技术和模式,用于将关系型数据库中的数据映射到对象导向编程语言中的对象,从而在应用程序中以面向对象的方式来处理数据库操作。

它允许开发人员使用类和对象来表示数据库表和记录,而不需要直接编写 SQL 查询语句。ORM 系统负责将对象的操作转化为对数据库的操作,同时也负责将数据库中的数据转化为对象,提供了一种更高层次、抽象的数据库访问方法。

一些常见的ORM框架和库包括 Hibernate(Java)、Entity Framework(.NET)、Django ORM(Python)、Sequelize(Node.js),以及各种其他语言和平台上的 ORM 工具。这些工具通常提供以下功能:

  • 对象映射:ORM 工具会自动将数据库表映射到编程语言中的类,表的列映射到类的属性,从而简化了数据模型的管理。

  • 查询语言:它们通常提供自己的查询语言或 API,使开发人员能够使用面向对象的方式查询和操作数据库,而不必编写原始的SQL查询。

  • 数据关系管理:ORM 可以处理表之间的关系,如一对多、多对一、多对多等,使开发人员能够更自然地表示和操作这些关系。

  • 数据库独立性:ORM 工具通常提供数据库独立性,允许应用程序在不同数据库管理系统上运行,而不必更改大部分应用程序代码。

  • 自动生成模式:一些 ORM 框架可以自动生成数据库模式、迁移数据和进行数据库操作,从而减少了手动数据库管理的工作。

  • 缓存管理:一些 ORM 工具支持缓存技术,可以提高应用程序的性能。

ORM的主要目标是简化数据库操作,提高开发效率,减少错误和提供更高的抽象级别,使开发人员可以更专注于业务逻辑而不必过多关注数据库细节。但需要注意,ORM 并不是在所有情况下都是最佳选择,特别是在需要高度优化性能的情况下,可能需要直接编写 SQL 查询语句。

为什么需要 ORM

  • 数据模型一致性:ORM 使开发人员能够使用面向对象的编程语言来表示数据库表和关系,这有助于保持数据模型的一致性。开发人员可以在代码中使用类和对象来表示数据库表和记录,而不需要手动编写 SQL 语句。

  • 提高生产效率:ORM 减少了开发人员编写和维护SQL查询语句的工作量。这意味着开发人员可以更快地开发应用程序,因为他们可以专注于业务逻辑而不是数据库细节。

  • 跨数据库兼容性:ORM 通常提供了跨不同数据库管理系统的兼容性。这意味着您可以更容易地切换或同时使用不同类型的数据库,而不必更改大部分应用程序代码。

  • 安全性:ORM 可以帮助防止 SQL 注入攻击,因为它们通常会自动处理输入数据的转义和参数化查询。

  • 抽象数据库细节:ORM 将数据库细节进行了抽象,使开发人员可以更专注于业务逻辑,而不必过多关注数据库的特定实现细节。

  • 代码维护性:ORM 可以使代码更容易维护,因为它们将数据库访问逻辑集中在一个地方,而不是分散在应用程序的各个部分。

  • 自动化:ORM 通常提供了自动生成数据库模式、迁移数据和进行数据库操作的工具,减少了手动管理数据库的需求。

Sequelize

Sequelize 是适用于 Oracle、Postgres、MySQL、MariaDB、SQLite 和 SQL Server 等的现代 TypeScript 和 Node.js ORM。
现在从一个小案例开始:

目录结构

1
2
3
4
5
6
7
.
├── index.js
├── models
│   ├── admin.js
│   └── db.js
├── package-lock.json
└── package.json

db.js 中进行数据库的连接

1
2
3
4
5
6
7
8
const Sequelize = require("sequelize")

const sequelize = new Sequelize("database", "username", "password", {
    host: "localhost",
    dialect: "mysql"
})

module.exports = sequelize

admin.js 中进行模型对象的创建,也就是用于映射到具体某个表的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const sequelize = require("./db")

const { DataTypes } = require("sequelize")

// 创建一个模型对象
const Admin = sequelize.define("Admin", {
    loginId: {
        type: DataTypes.STRING,
        allowNull: false
    },
    loginPwd: {
        type: DataTypes.STRING,
        allowNull: false
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
}, {
    createdAt: false,
    updatedAt: false,
    paranoid: true // 一个 paranoid 表示一个被告知删除记录 不会真正删除它的表 一个名为 deletedAt 的特殊列会将其值设置为该删除请求的时间戳
})

const createModel = async () => {
    await Admin.sync({ alter: true })
    console.log("模型 Admin 同步完成")
}

createModel()

module.exports = Admin

最后在 index.js 中进行导入 admin.js,并使用 node 命令运行它,大功告成。

更多有关 Sequelize 的学习参见官方文档 https://sequelize.org