在rails中没有真正的“预备声明”?

时间:2010-06-21 13:53:03

标签: ruby-on-rails activerecord prepared-statement

当我们使用ActiveRecord时,我们可以使用:

User.find(:first, :conditions=>["name=?", name])

看起来ActiveRecord正在使用'预备语句',但在查看代码之后,我发现ActiveRecord只是使用String.dupconnection.quote()来调整内容以构建一个sql,而不是像Java一样。

那么,raiils中没有真正的prepared statment?为什么rails没有提供呢?

3 个答案:

答案 0 :(得分:5)

如果准备好的语句是指一个以编译形式保存以便更有效执行的SQL,那么你是正确的:它不是在Rails中实现的。这有几个原因:

  1. Rails是Web框架 - 它不知道或不关心数据库。默认情况下,Rails使用
    • 用于对象关系映射的ActiveRecord。如果您愿意,可以更改它 - 它甚至不必是RDBMS。
    • ActiveRecord不了解特定的数据库平台。为此,它依赖于“适配器”,它将AR的需求转换为特定于平台的SQL。
    • 一些具有AR适配器的RDBMS支持预处理语句(或等效语句),但其他语句不支持。

答案 1 :(得分:3)

Rails 3.1(或更高版本)支持预准备语句。您创建的每个新查询都将添加到预准备语句池中。如果您正在使用MySql DB,它仍然不支持预准备语句,因为在没有预准备语句的情况下,在MySql中使用预准备语句会降低性能。 HerePat Shaughnessy关于此的好文章。

答案 2 :(得分:2)

在许多(大多数?)方式中,DB View是一个准备好的语句。使用ActiveRecord很容易使用视图。只需在数据库中声明视图(我使用rake任务),然后通过ActiveRecord访问它。

非常适合对复杂SQL的只读访问。从解析/计算SQL所需的许多步骤中保存数据库。