首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么所有的Active Record都讨厌?

为什么所有的Active Record都讨厌?

Active Record是一种对象关系映射(ORM)技术,它将数据库表中的记录与应用程序中的对象进行映射。Active Record提供了一种简单的方法来实现数据库操作,但是在某些情况下,它可能会导致一些问题,例如性能问题、安全问题和可维护性问题。

以下是一些可能导致Active Record被讨厌的原因:

  1. 性能问题:Active Record会自动生成SQL语句,这可能会导致生成的SQL语句不够高效,从而影响应用程序的性能。
  2. 安全问题:Active Record可能会导致SQL注入等安全问题,因为它将用户输入直接插入到SQL语句中,而没有进行任何验证或转义。
  3. 可维护性问题:Active Record可能会导致代码难以维护,因为它将数据库操作和业务逻辑混合在一起,而且它的代码生成功能也可能会导致代码难以理解和修改。

总之,Active Record是一种强大的ORM工具,但是在使用时需要注意其潜在的问题,并采取适当的措施来避免这些问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么几乎所有的开源数据库中间件都是国内公司开源的?并且几乎停止了更新?

国内数据库的存储访问量几千万甚至上亿也是司空见惯的事情,特别是国内互联网行业快速的发展,高负载的数据库中间件也是应运而上,在早期得到很大一部分的人认可,但是随着大家在这块都有足够的积累之后慢慢这块的热度已经在慢慢下降了,现在很多企业掌握了这个技术...因为国内每年毕业的学生加入到计算机编程行业都能达到几十万上百万,对于国内以应用级开发为主的环境下老程序员的生存环境不是那么理想,所以很多技术能力不错的技术人员早早就告别了技术生涯开始创业或者转行做管理去了,无论水平高低程序员在接近40岁的时候开始为自己的后半生考虑了

72430

PHP将死。何以为继?

就在我这个顽固的PHP分子正要把一个现有的Ruby on Rails代码库转换成PHP时,我要说这样的话。 历史在重演 我认为PHP将亡,因为我以前见到过。大概十年之前,PHP灭掉了Perl。...但总之PHP赢了,因为上面所说的这些问题 并不是这种语言固有的。...第二,我讨厌Active RecordActive Record是一种模式,并不是Ruby固有的,在Rails的最新版本里是可选择的,但是对它的使用和这种模式已经深入到了Rails的DNA里了。...我 之前曾解释过为什么我认为这数据库上的ORM不是个好做法,所以我不会再重复解释,但有一点我需要总结的就是你省去了手工写CRUD所获得的效能要大于 ActiveRecord做傻事损失的效能,要花时间搞清楚它是怎么工作的...我希望有这样一种语言,它能够承担起我开发一个MVC式的web应用时的 有的任务,所有功能都是核心内置的,不能仅是一个程序包。 问题是,没有这样的一种语言。

1.5K60

MySQL 案例:Update 死锁详解

背景 锁作为 MySQL 知识体系的主要部分之一,是每个 DBA 需要学习和掌握的知识。锁保证了数据库在并发的场景下数据的一致性,同时锁冲突也是影响数据库性能的因素之一。...用户针对这个死锁的问题,提出了疑问:数据更新的并不是同一行,使用的也是不同的索引,为什么会发生死锁?...用户提出的疑问:使用的也是不同的索引,为什么会发送死锁?实际上二级索引上的记录锁,最终也会加到主键上。...参考上文引用的信息,具体发生死锁的行的信息记录在类似0: len 4; hex 00722663; asc r&c;;的信息中。...而 trx2 持有的锁信息中,第一个刚好就是 trx1 等待的: [trx2 持有的锁] 那么关于这个死锁案例的具体场景,就可以用下有向环的图例进行说明: [死锁图例] 至此为止,这个死锁的案例分析就完成了

14.1K173

解决死锁之路(终结篇)- 再见死锁

首先看事务一的信息: * (1) TRANSACTION: TRANSACTION 182335752, ACTIVE 0 sec inserting ACTIVE 0 sec 表示事务活动时间,inserting...对每一个死锁场景,我都会定义一个死锁名称(实际上就是事务等待和持有的锁),每一篇分析,我分成了 死锁特征、死锁日志、表结构、重现步骤、分析和参考 这几个部分。...如上面的案例一和案例三示,对索引加锁顺序的不一致很可能会导致死锁,所以如果可以,尽量以相同的顺序来访问索引记录和表。...对死锁的研究前前后后烧了不少的脑细胞,特别是后期收集死锁日志的时候,才发现死锁场景各式各样,有些死的很荒谬,有些死的很精妙,还有些死的不明不白,直到现在我还没搞懂为什么。...所有的这些死锁案例收集在 这里,如果你感兴趣,欢迎来和我一起添砖加瓦,希望有一天,真的可以和死锁说再见。

9.3K116

从 Java 12 到 Java 17 那些激动人心的新特性

public abstract sealed class Color permits Red, Blue, Yellow 也就是说,只有 Red、Blue 和 Yellow 可以继承这个类,其他类想要继承它无法通过编译...这个增强在 Java 14 中正式发布,提高了空指针异常 (NullPointerException,简称 NPE) 的可读性,可以打印出在抛出异常位置调用的方法的名称和空变量的名称。...我们知道,NPE 是一种非常常见的异常,虽然在大多数情况下找出导致抛出异常的根源并不难,但你会时不时地遇到同时有两三个可疑变量的情况。你进入调试模式,开始查看代码,但问题很难重现。...Oracle 非常讨厌大多数 switch 语句包含很多的 CASE BREAK、CASE BREAK、CASE BREAK……。 老实说,他们讨厌这个是对的,因为人们很容易在这个地方犯错。...如果你声明了一个与默认构造函数一样的构造函数,你要初始化所有的字段: public record Coord(int x, int y) { public Coord(int x, int y) {

56930

解决死锁之路(终结篇)- 再见死锁

首先看事务一的信息: * (1) TRANSACTION: TRANSACTION 182335752, ACTIVE 0 sec inserting ACTIVE 0 sec 表示事务活动时间,inserting...对每一个死锁场景,我都会定义一个死锁名称(实际上就是事务等待和持有的锁),每一篇分析,我分成了 死锁特征、死锁日志、表结构、重现步骤、分析和参考 这几个部分。...如上面的案例一和案例三示,对索引加锁顺序的不一致很可能会导致死锁,所以如果可以,尽量以相同的顺序来访问索引记录和表。...对死锁的研究前前后后烧了不少的脑细胞,特别是后期收集死锁日志的时候,才发现死锁场景各式各样,有些死的很荒谬,有些死的很精妙,还有些死的不明不白,直到现在我还没搞懂为什么。...所有的这些死锁案例收集在 这里,如果你感兴趣,欢迎来和我一起添砖加瓦,希望有一天,真的可以和死锁说再见。

2.3K71

Java 8之后的那些新特性(六):记录类 Record Class

数据传输对象 • VO (Value Object) 值对象 • POJO (Plain Old Java Object) 普通Java旧对象 上面这些概念可能在不同的框架,不同的项目中都可能出现,但它们基本上代表一个含义...由于这些重复啰嗦的东西非常令人讨厌,以至于Java生态中出现了一个解决这个问题的框架,就是java lombok,lombok就是简化很多Java类编写的代码的一个侵入式的框架。...当然,从这一点上也可以感受到,大家是多讨厌Java中这种重复啰嗦的定义。 Kotlin的data class 还是来参考下友军是怎么做的吧。...编译器会自动帮你 • 生成hasCode以及equals方法 • toString方法 而getter,setter方法在Kotlin中本来就是默认不需要显式定义的,编译器帮你自动作了,这是针对所有类都有的行为...Java中的所有record类,默认实现了Record接口 @Test void testRecord(){ record Point(double x,double

2.2K30

实战分享 | 你知道这个死锁是怎么产生的吗?

---- Part1 背景 锁作为 MySQL 知识体系的主要部分之一,是每个 DBA 需要学习和掌握的知识。锁保证了数据库在并发的场景下数据的一致性,同时锁冲突也是影响数据库性能的因素之一。...用户针对这个死锁的问题,提出了疑问:数据更新的并不是同一行,使用的也是不同的索引,为什么会发生死锁?...用户提出的疑问:使用的也是不同的索引,为什么会发送死锁?实际上二级索引上的记录锁,最终也会加到主键上。...参考上文引用的信息,具体发生死锁的行的信息记录在类似0: len 4; hex 00722663; asc r&c;;的信息中。...而 trx2 持有的锁信息中,第一个刚好就是 trx1 等待的: ? trx2 持有的锁 那么关于这个死锁案例的具体场景,就可以用下有向环的图例进行说明: ?

58850

凡是你排斥的,就是你所要学习的

这也就是为什么当我们跟一个人越亲密,就越容易产生厌恶,因为他让你看到自己的真面目。 别人最惹你讨厌的地方,通常也是你最受不了自己的地方。 法则二:你是什么样的人,就会认为别人是什么样。...老遇到讨厌的事的,往往是令人讨厌的人。喜欢挑人毛病的人,其实自己才是最有毛病;喜欢说三道四的人,其实自己才使最不三不四。...我们吸引的关系,反映出我们拥有的特质,以及呈现我们的内在自我。 所以,关系处问题的人,不仅要检讨你跟别人的关系,也要反省你跟自己的关系。...以眼还眼,结果是大家瞎了 如果你不断在记忆中反刍旧伤痛,你就是给了最初导致伤痛的人、事一再伤害你的力量。 那就是我为什么说,当你怨恨别人时,表示某种程度上,你也怨恨自己。...无论是你的老板、同事、部署、朋友、情人、配偶或小孩皆然,这些人有的不喜欢的个性、想法和行为,往往都是你需要学习的部分。 他们会显露你的阴影,会一再地重复你厌恶的言行来让你学习。

26430

Active Record基础

Active Record 是MVC中的M,负责处理数据和业务逻辑,Active Record实现了Active Record模式,是一种 对象关系映射 系统 Active Record 模式: 在 Active...Record 模式: 中,对象中既有持久存储的数据,也有针对数据的操作,Active Record 模式把数据存取逻辑作为对象的一部分,处理对象的用户知道如何读写数据。...Active Record 的约定 命名约定 Rails把模型的类名转换为复数,然后查找对应的数据表,Rails提供的单复数转换功能非常强大,类名应该使用驼峰命名: ?...创建模型关联后,Active Record 会查找这个字段。 主键: 默认情况下,使用证整数字段id作为表的主键。...Product < ApplicationRecord end 如果应用需要使用其他的命名约定,或者在 Rails 中使用已有的数据库,则可以覆盖默认的命名约定,如修改表名和主键名: class

3.2K20

混搭 TypeScript + GraphQL + DI + Decorator 风格写 Node.js 应用

两种操作模式 这里简单说明一下,ORM 架构模式中,最流行的实现模式有两种:Active Record 和 Data Mapper。...比如 Ruby 的 ORM 采取了 Active Record 的模式是这样的: $user = new User; $user->username = 'philipbrown'; $user->save...不同于现有的所有其他 JavaScript ORM 框架,TypeORM 支持 Active Record 和 Data Mapper 模式(在我这次写的项目中,使用的是 Active Record...Record 模式还是 Data Mapper 模式,**TypeORM 在 API 上的命名使用上几乎是保持一致,这大大降低了使用者记忆上的压力:**比如上方保存操作,称为 save 方法,只不过前者是放在...我们所有的 GraphQL Resolver 放在 'app/resolver' 目录下 ?

3.2K20

业务逻辑层相关(文字信息版本)

Active Record模式中,每个业务对象均负责自己的持久化和相关的业务逻辑。...典型应用就是结合MVC模式+Active Record ORM 3.Anemic Model(贫血模型): 有时候会被称为一种反模式,初看来,该模式和Domain Model模式有些类似,也会找到表示业务领域的领域对象...这些事物包含数据,当然它们还有相应的行为,以及它所有的业务和领域规则。 Domain Model 越能表示真实的领域越好,这样就更容易理解和复制业务组织中的业务和规则以及验证过程。...Domain Model和Active Record之间的区别在于,Domain Model中的实体都不知道如何持久化自己,而且也没有必要在数据模型和实体模型建立一对一的映射关系。...与Transaction Script 以及Active Record模式相比,由于Domain Model模型中不包括访问数据库的代码,所以他可以很方便的进行单元测试。

29920

重做日志和日志挖掘

重做日志-Redo log 首先给出参考资料: 1、Oracle官网-Managing the Redo Log 为什么需要redo log 内存中数据修改后,不必立即更新到磁盘—效率 由日志完成数据的保护目的...这是为什么呢?原来是后台归档进程ARCn将active redo log file归档成归档日志文件,相应的状态就由active变成了inactive。此时group1就不再用于实例恢复了。...为什么Oracle不用时间来界定呢? 我在北京时间8:00的时候执行一条DML语句,然后修改机器上的时间为7:00,再执行一条DML语句。.../uid-18974058-id-3068592.html 日志文件 日志文件使用操作系统块大小 通常是512bytes 格式依赖于 操作系统 Oracle版本 Redo日志组成 数据头 redo record...Redo record 一个redo record记录包括 Redo记录台 一个或多个改变向量 每个redo record包含每个原子改变的undo和redo 某些改动不需要undo(临时表,直接加载

1.3K31

故障分析 | 从 Insert 并发死锁分析 Insert 加锁源码逻辑

----------------------- 2023-03-24 19:07:50 140736694093568 *** (1) TRANSACTION: TRANSACTION 56118, ACTIVE...在 8.0.18之前,只包括事务1等待的锁,事务2持有的锁、等待的锁,而不包括事务1持有的锁信息; B.以上示例还包括具体的索引记录值(如{10,26}:第一字段为索引记录的值,第二个字段为对应的主键记录...至此,回答了最开始提出的问题Q1: Q1: T1为什么会持有 ua中记录10 的锁?...那为什么看到时LOCK S,是因为LOCK_ORDINARY对应的数字表示为0,任何与之进行“与”运算等于本身,所以看不出来: 图片 C....由于是T2在的线程为T1创建的锁,因此该锁对应的thread_id为T2的线程ID,但trx_id为T1的事务ID D.

62310

这样分析一个死锁问题

我们看到的是最后得到的一个状态信息(类似盖上印章的一瞬间),而完整的过程是没法通过日志体现出来的,还有一个,如果仔细看上面的日志就会发现,事务1的日志还是不够完整,持有的锁,等待的锁,只打印出了等待的锁...*** (1) TRANSACTION: TRANSACTION 2844, ACTIVE 46 sec starting index read mysql tables in use 1, locked...mode S waiting) 2017-09-11T10:07:08.103243Z 6 [Note] InnoDB: *** (2) TRANSACTION: TRANSACTION 2843, ACTIVE...lock,等待的锁为S锁,出现S锁看来是一个突破口,我们就需要明白为什么会是S锁,事务2中相关的SQL是insert语句,如果需要进行唯一性冲突检查的时候,是需要先加一个S锁,所以由此我们可以进一步推理出这个...事务2中的持有的S锁,我们可以从下往上去推理,事务1上面肯定是一个delete操作,也就是日志中的第一部分显示,是一个delete操作。

85640
领券