2014-02-12 82 views
3

如何在MySQL中为insertselect查询创建预准备语句?我现在用的是MySQL2宝石,和我的连接对象是这样的:使用MySQL2 gem准备的语句?

con = Mysql2::Client.new(:host => "#{ENV['DB_HOST']}", :port => '3306', :username => "#{ENV['DB_UNAME']}", :password => "#{ENV['DB_PWD']}", :database => 'dbname') 
+0

请只问一个问题。您如何使用MySQL生成准备好的语句,为什么您应该使用准备好的语句以及它们的替代选择是三个问题,并且无法在单个问题中正确解决。我建议把你的问题减少到第一个问题,然后花一些时间研究其他两个问题,因为他们会因为需要在答案中提供的信息量而变得无关紧要。 –

+0

它下降到一个问题..如何生成与MySQL2宝石红宝石准备好的声明? – Oatmeal

回答

6

遗憾的是,宝石mysql2不准备发言表示支持呢。贡献者计划在不久的将来增加这样的功能,我们可以通过这个拉入请求的讨论,请参阅:

https://github.com/brianmario/mysql2/pull/289

如果您的应用程序必须准备发言,我会建议你读到续集,这对准备好的语句和绑定变量的一个非常好的支持:

https://github.com/jeremyevans/sequel

http://sequel.jeremyevans.net/rdoc/files/doc/prepared_statements_rdoc.html

UPDATE

正如在版本@lulalala开始提到0.4.0MySQL2 gem支持预处理语句:

statement = @client.prepare("SELECT * FROM users WHERE login_count = ?") 
result1 = statement.execute(1) # Binds the value 1 to the placeholder 
result2 = statement.execute(2) # Binds the value 2 to the placeholder 

statement = @client.prepare("SELECT * FROM users WHERE last_login >= ? AND location LIKE ?") 
result = statement.execute(1, "CA") # Binds 1 and 'CA' to the placeholders, respectively 

我希望帮助。

+0

+1我绝对第二次推荐检查续集。这是一个很好的ORM,并且是我在工作中所做的核心。 –

+0

我们完全同意@TheTinMan!我真的很喜欢续集。它是健壮的,并有一个非常漂亮的界面来互动= P –

+1

@Oatmeal没关系,但请记住,这不是你的问题的答案。使用ActiveRecord与使用mysql2 gem不是一回事。这是Rails默认的ORM。这是我们所用的相同解决方案,但是具有不同的ORM。 –

1

你也可以使用mysql2-CS-绑定宝石,mysql2的瘦包装它增加了预处理语句功能: https://github.com/tagomoris/mysql2-cs-bind

它提供xquery方法接受参数的语句:

require 'mysql2-cs-bind' 
client = Mysql2::Client.new(...) 
client.xquery('SELECT x,y,z FROM tbl WHERE x=? AND y=?', val1, val2) #=> Mysql2::Result