2010-06-29 67 views
12

我還不清楚如何使用Sequel運行原始SQL查詢。如何使用Sequel運行原始SQL查詢

目前我想這一點:

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") do |row| 
@zonename = row 
end 

我如何可以運行查詢作爲原始SQL訪問,然後像正常的結果?

if @zonename.name = "UK" 

回答

11

我有幾個三分球這可能是有用的:

  1. 你可以簡單地做:

    @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).first 
    

    NB:你忽略了一個事實,有可能是更多的結果匹配標準。如果您期望返回多個可能的行,那麼你可能想通過做建設成果的一個數組...

    @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).all 
    

    和處理所有的人。

  2. 返回集是一個散列。如果@zonename點的一個記錄,那麼你可以做

    @zonename[:column_name] 
    

    指一個名爲「欄」字段。你不能這樣做@zonename.colum_nname(你實際上可以使用一些元編程用輔助方法修飾@zonename,但我們暫時忽略它)。

續集是一個很好的界面,越多你瞭解它越多,你會喜歡它。

+0

謝謝,我現在能夠進步 – veccy 2010-06-29 22:26:12

12

注意,代替:

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") 

你應該做的:

DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode) 

否則,你打開自己的SQL注入,如果你不控制@dialcode內容。

+0

你能告訴我什麼方法被引擎蓋下的'fetch'所調用以逃避用戶輸入嗎?我有一個複雜的查詢,它是用許多方法構建的,並且在構建查詢時需要從我的數據庫調用中分別轉義用戶輸入。 – 2014-04-24 07:23:07

+0

對不起,剛剛在文檔中找到它(我在搜索時正在閱讀該文檔,將在此處爲其他人發佈):https://github.com/jeremyevans/sequel/blob/cf1e987c1c2f7e74dca5c0f8312149bede659a21/doc/security.rdoc。該方法是'DB.literal(my_insecure_string)'。謝謝你的圖書館傑里米。 – 2014-04-24 07:26:13