PostgreSQL & Sequelize:我们应该使用关系数据库吗?
我们应该使用关系数据库吗?
让我们假设答案是肯定的。 在这个前提下,我们可以继续阅读。
Sequelize 是一个所谓的 ORM(“对象关系管理器”)。现在,我们的应用程序与数据库通信不一定需要这些库。 在以下内容中,大家可以阅读我对 ORM 在哪些方面有很大帮助以及在哪些方面可能没有帮助的一些想法。
假设各位已经了解 PostgreSQL 和 Node.js 的基础知识。
首先,Sequelize 的基础是什么:
- 它适用于许多不同的数据库:Postgres、MySQL、MariaDB、SQLite 等
- 我们只需要定义自己的模型和类型(很像在数据库层本身)
- 可以获得很多开箱即用的功能
- 从应用程序到数据库的所有事务都通过 Sequelize 发生。 这个额外的层可以更容易地设置保护措施,因此脏数据不会被写入数据库。
定义模型
现在,这是使用 ORM 最酷的事情之一——在代码中包含我们自己的数据库方案和模型。 它有点像基础设施即代码,但用于您的数据库。 让我们看一个例子:
const { DataTypes } = require("sequelize");
const MyDBModel = {
id: { type: DataTypes.STRING, primaryKey: true },
name: { type: DataTypes.STRING },
date: { type: DataTypes.DATE },
someNumber: { type: DataTypes.INTEGER, allowNull: true },
incrementMe: { type: DataTypes.INTEGER, autoIncrement: true }
}
有了这样的 MyDBModel
,我可以使用 Sequelize 中的内置数据类型,它会自动为我们提供类型检查。 上面是一个简单的例子,有一个主键和几个不同的数据类型字段。
现在我们可以使用上面的定义来插入新项目以及执行功能。
假设我们想从所有具有特定名称的行中获取 id、name、date 和 incrementMe:
1. 使用 ORM 方式
const getRowForSite = async ({ connection, name }) => { // This method takes a specific connection to the db (This is also provided from Sequelize)
try {
const Model = connection.define("Model", MyDBModel);
let res = await Model.findAll({
attributes: ["id", "date", "name", "incrementMe"],
order: connection.literal('date DESC'),
where: {
name
}
});
return res;
} catch (error) {
return Promise.reject(error);
}
};
2. 使用 SQL 方式
以上将返回与等效的原始 SQL 查询相同的结果:
SELECT id, date, name, incrementMe
FROM MODEL
WHERE name = 'YOUR NAME'
ORDER BY date DESC
现在这似乎不是一个大胜利。 但是在第一个示例中,构建额外的逻辑并在代码的许多地方重用该函数要容易得多。 这只是一个简单的例子,但我观点很清楚。
对于插入,我们还增加了类型检查的功能。 其他有用的功能是:
-
findOrCreate
见名知意。 创建一条数据或检索现有数据(如果存在)。 -
findAndCountAll
这对于创建与分页相关的查询很有用。 -
Validators
这些是我们可以分配给自己的字段的额外“检查”。 这些不同于 type 字段,因为它本质上是由 Sequelize 创建的预配置正则表达式。 这可能是我们只允许在特定字段中使用 x 字符,或者将只允许在另一个字段中使用 isIPv6。 可以在此处找到更长的验证器列表
总结
许多人不擅长编写 SQL,包括我自己。这很可能是由于我在职业生涯中担任的角色,没有太多关注数据库层。
在非常大的系统中,将重点放在数据库上并尽可能优化它的所有部分会很有帮助。
以我的经验,这在大型项目中是有意义的,但在较小的项目中,数据库的东西通常只是你在开始/创建数据库期间接触的东西。
由于这些原因,我从来没有在编写查询和专门研究超高级数据库模式方面得到一致的实践。因此,我也发现使用 ORM 是一件令人愉快的事情,因为这一切似乎都更加规范化,我更加自在。
作为一种更简单的折衷方案,ORM 有时会为我们创建性能不如超级熟练的开发人员可以编写的查询。对于我的用例,目前性能还不错。
最后一点:ORM 通常是相对较大的库,因此在某些情况下,所有的代码不会比添加额外的代码来生成构建时间、更新时间等,这给我们带来很多的好处。
相关文章
在一个 PostgreSQL 查询中使用多个 WITH 语句
发布时间:2023/03/20 浏览次数:127 分类:PostgreSQL
-
在本教程中,我们将学习如何使用多个 WITH 语句在 PostgreSQL 中使用两个临时表执行查询。
在 Ubuntu 上的 PostgreSQL 中找到配置文件
发布时间:2023/03/20 浏览次数:130 分类:PostgreSQL
-
本文介绍如何在 Ubuntu 上找到 PostgreSQL 数据库的配置文件。
在 PSQL 中运行 SQL 文件
发布时间:2023/03/20 浏览次数:177 分类:数据库
-
本文解释了如何直接从终端/命令行或 psql shell 运行 SQL 文件。为此,你需要指定主机名、端口、用户名和数据库名称。
在 PostgreSQL 中使用循环
发布时间:2023/03/20 浏览次数:116 分类:PostgreSQL
-
在 PL/SQL 中,你可能需要在 Postgres 中使用循环。我们可以使用 FOR 和 WHILE 语句来创建循环。
在 PostgreSQL 中重命名和更改列类型的单个查询
发布时间:2023/03/20 浏览次数:121 分类:PostgreSQL
-
本文介绍如何在 PostgreSQL 中仅使用单个查询来重命名列以及更改其类型。
在 PostgreSQL 中使用 Select 连接列
发布时间:2023/03/20 浏览次数:202 分类:PostgreSQL
-
本文介绍如何在 PostgreSQL 中使用 Select 方法连接列。