我正在尝试执行一个查询,从存储在query
变量中的用户输入中选择匹配搜索词的菜谱。这是相关守则的一部分:
class DatabasePersistence
def initialize(logger)
@db = if Sinatra::Base.production?
PG.connect(ENV['DATABASE_URL'])
else
PG.connect(dbname: "recipes")
end
@logger = logger
end
def search_recipes(query)
p "Query parameter is:"
p query
p query.class
sql = <<~SQL
SELECT * FROM recipes
WHERE labels ILIKE '%$1::text%'
SQL
results = query(sql, query)
# ... more code
end
def query(statement, *params)
@logger.info "#{statement}: #{params}"
@db.exec_params(statement, params)
end
end
执行此行results = query(sql, query)
时会引发以下错误。
PG::IndeterminateDatatype at /search
ERROR: could not determine data type of parameter $1
另一个职位建议添加显式类型强制转换,这就是我添加类型强制转换的原因。我可能做错了。我还尝试了如下几点:
WHERE labels ILIKE '%text($1)%'
WHERE labels ILIKE '%cast($1 as text)%'
WHERE labels ~ '$1::text'
WHERE labels ~ 'cast($1 as text'
在所有上述情况下,它返回相同的错误“无法确定参数的数据类型。我添加了一些#p
方法调用,以确保query
变量引用了调试器的实际值。我已经确认,当query
引用值为oats
的字符串对象时,会发生此错误。”
如果我正在转换数据类型而不是nil
,那么是什么导致这个错误仍然发生呢?我传递的参数不正确吗?我的参数投错了吗?是否有可能将数据类型作为参数传递给#exec_params
方法?还有另一种方法可以安全地传递由PG.connect
类的实例执行的参数吗?
发布于 2022-06-15 21:52:48
https://stackoverflow.com/questions/72638226
复制相似问题