2010-06-29 33 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

相关问题