Ruby postgres避免在字符串中使用额外引号
我有下面的select查询,我将把它传递到数据库以获取结果Ruby postgres避免在字符串中使用额外引号,ruby,postgresql,Ruby,Postgresql,我有下面的select查询,我将把它传递到数据库以获取结果 sql = "select * from movies where title = #{movie_title};" movie_title包含的值有时可以包含单引号和其他需要转义的字符。我遇到过一个带美元引号的字符串,它在INSERT语句中使用时运行良好,但SELECT的行为并不相同,如果我像这样使用$${movie\u title}$$,它就不会转换为movie\u title中的值。有什么解决办法吗 我用的是postgres 9
sql = "select * from movies where title = #{movie_title};"
movie_title包含的值有时可以包含单引号和其他需要转义的字符。我遇到过一个带美元引号的字符串,它在INSERT语句中使用时运行良好,但SELECT的行为并不相同,如果我像这样使用$${movie\u title}$$,它就不会转换为movie\u title中的值。有什么解决办法吗
我用的是postgres 9.5.0,我用的是ruby。坏主意。不要这样做,因为这会使您的代码容易受到SQL注入攻击,同时也会使您的生活更加艰难。阅读有关准备好的SQL语句、SQL注入等的更多信息 简而言之,除非您正在使用某种ORM,否则您应该执行以下操作:
#!/usr/bin/ruby
require 'pg'
if ARGV.length != 1 then
puts "Usage: prepared_statement.rb rowId"
exit
end
rowId = ARGV[0]
begin
con = PG.connect :dbname => 'testdb', :user => 'janbodnar'
con.prepare 'stm1', "SELECT * FROM Cars WHERE Id=$1"
rs = con.exec_prepared 'stm1', [rowId]
puts rs.values
rescue PG::Error => e
puts e.message
ensure
rs.clear if rs
con.close if con
end
从
编辑:您不需要使用准备好的语句,也可以使用提供适当参数绑定的DB lib方法:
require 'pg'
conn = PG::Connection.open(:dbname => 'test')
res = conn.exec_params('SELECT $1 AS a, $2 AS b, $3 AS c', [1, 2, nil])
看一下文档,看看是否有什么坏主意。不要这样做,因为这会使您的代码容易受到SQL注入攻击,同时也会使您的生活更加艰难。阅读有关准备好的SQL语句、SQL注入等的更多信息 简而言之,除非您正在使用某种ORM,否则您应该执行以下操作:
#!/usr/bin/ruby
require 'pg'
if ARGV.length != 1 then
puts "Usage: prepared_statement.rb rowId"
exit
end
rowId = ARGV[0]
begin
con = PG.connect :dbname => 'testdb', :user => 'janbodnar'
con.prepare 'stm1', "SELECT * FROM Cars WHERE Id=$1"
rs = con.exec_prepared 'stm1', [rowId]
puts rs.values
rescue PG::Error => e
puts e.message
ensure
rs.clear if rs
con.close if con
end
从
编辑:您不需要使用准备好的语句,也可以使用提供适当参数绑定的DB lib方法:
require 'pg'
conn = PG::Connection.open(:dbname => 'test')
res = conn.exec_params('SELECT $1 AS a, $2 AS b, $3 AS c', [1, 2, nil])
查看文档使用Ruby的Postgresql驱动程序传递参数。使用Ruby的Postgresql驱动程序传递参数。感谢教程,这很好。但是,我必须重新编写代码,将准备好的语句合并到sql中。请参阅我的编辑。尝试更彻底地阅读您正在使用的库的文档。def run_sqlsql db=PG.connectdbname:'omdb'results=db.execsql db.close return results end我使用这个方法来执行所有sql语句,现在它不带任何参数。我有insert语句,它几乎包含十个参数。我理解你的解决方案,但如果不修改大量代码,我无法在当前的设计中实现。那么,这显然是一个糟糕的设计。如果你和你的同事对此没有意见,那就保持原样吧/顺便说一句,方法可以接收多个参数,我希望你知道。谢谢你的教程,很好。但是,我必须重新编写代码,将准备好的语句合并到sql中。请参阅我的编辑。尝试更彻底地阅读您正在使用的库的文档。def run_sqlsql db=PG.connectdbname:'omdb'results=db.execsql db.close return results end我使用这个方法来执行所有sql语句,现在它不带任何参数。我有insert语句,它几乎包含十个参数。我理解你的解决方案,但如果不修改大量代码,我无法在当前的设计中实现。那么,这显然是一个糟糕的设计。如果你和你的同事对此没有意见,那就保持原样吧/顺便说一句,方法可以接收多个参数,希望您知道。