我还不清楚使用Sequel运行原始SQL查询的正确方法。
目前我正在尝试这样做:
DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") do |row|
@zonename = row
end
我该如何以原始SQL运行查询,然后像正常情况下一样访问结果?
if @zonename.name = "UK"
DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1")
你应该这样做:
DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode)
如果您不控制@dialcode
的内容,否则将会存在 SQL 注入的风险。
我有一些可能有用的提示:
你可以简单地执行以下操作:
@zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).first
注意:您忽略了可能还有更多符合条件的结果。如果您希望返回多个可能的行,则可以通过执行...来构建结果数组。
@zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).all
并处理它们所有。
返回的集合是一个哈希。如果@zonename
指向其中一条记录,则可以执行以下操作:
@zonename[:column_name]
要引用一个名为“column_name”的字段。你不能使用@zonename.column_name
(实际上,你可以使用一些元编程来装饰@zonename
并使用帮助方法,但我们暂且忽略它)。
Sequel是一个优秀的接口,你学得越多,就会越喜欢它。
fetch
在底层调用了哪个方法来转义用户输入吗?我有一个复杂的查询,由许多方法构建而成,并且需要在构建查询时单独转义用户输入,而不是在数据库调用中。 - Mike H-RDB.literal(my_insecure_string)
。感谢 Jeremy 提供的库。 - Mike H-R