类似Sequelize这种ORM是否有一个总体的设计思路,怎么样去使用它们能达到比较好的效果?

发布于 2022-08-28 13:10:48 字数 451 浏览 5 评论 0

用了关系型数据库好多年(Access/MS SQL Server/MySQL/Sqlite都有或多或少的接触和使用),一直都使用“一句SQL完成一件事”的想法来写。

昨天在写一个新的Node项目,使用了Sequelize这个ORM,在看它的更新数据方法的时候,发现必须得有被更新数据的引用才可以(即先find再update)更新。而且在数据的使用上也有一些和使用SQL不一样的地方,比如第二次获取某条数据可以用“第一次数据.reload()”来完成更新。

我的问题是:类似Sequelize这种ORM是否有一个总体的设计思路,怎么样去使用它们能达到比较好的效果?虽然按之前的思维,想完成一次数据操作就调用一系列API来完成也可以完成任务,但总觉得哪里不对。比如是不是取数据的时候就应该将引用保存在某个地方,然后后续所有操作都直接拿这个引用来操作?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

笨死的猪 2022-09-04 13:10:48

用 OOP 的方法论,访问数据。就是 ORM 的设计哲学。你不在是用 SQL 访问数据库。SQL是底层的,你只需要知道该对象(你数据库的记录)的对应方法是如何访问属性,如何获取,如何遍历,如何存储等等。知道几个方法,之后再也不用 SQL 了。

那些过往 2022-09-04 13:10:48

不一定哦,怎么优化要根据你的 orm 框架是怎么实现的,但是大部分(我觉得好的)orm 框架都是 -- lazy queryset,也就是说只有你 evalute queryset 的值时,sql 才真正被执行。
所以怎么优化看 orm 框架里什么操作能导致 evalute 你的 queryset。

举个例子:

alldata = People.objects.all() // 没执行 sql
white_people = alldata.objects.filter(skin='white') // 没执行 sql
for p in white_people:// evalute queryset white_people, 这才执行 sql
    print(p.name)

另外如果框架有缓存,那么也不用担心 evalute 多次

for p in white_people:// 遍历一般会导致evalute queryset white_people, 这才执行 sql
    print(p.name)
for p in white_people:// 又来一次evalute, 用的是 white_people 的缓存,不会执行 sql
    print(p.name)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文