簡體   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