繁体   English   中英

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

[英]There is no real 'prepared statement' in rails?

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

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

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

那么,在raiils中没有真正prepared statment吗? 为什么rails不提供它?

如果通过预处理语句表示一个以编译形式保存以便更有效执行的SQL,那么你是正确的:它不是在Rails中实现的。 有几个原因:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM