2013-04-09 57 views
2

我试图插入远程mysql数据库。我能够正确连接,并可以查询'选择'没有问题。但是,我无法执行插入到我可以从中选择的同一个表中。我怀疑它与我的绑定有关,但这与我用来获取sqlite3的工作几乎完全相同,我认为它使用相同的Arel来插入。使用Mysql2的Ruby SQL插入宝石

@result = @db.query("insert into lead_to_processes (case_number, style_of_case) values (?,?)", [ 
     self.case_number.to_blob.force_encoding("UTF-8"), 
     self.style_of_case.to_blob.force_encoding("UTF-8") 
    ] 
) 

最终目标是能够从模型内部查询远程数据库并向其中插入数据。我尝试过使用Octopus,但这并不奏效,因为这些表格将与数据库不同。

我在数据库上拥有此用户的完全权限。

所以从如下指导意见我改变了语法和我得到一个不同的错误

Mysql2 ::错误:你在你的SQL语法错误;

但是我做的查询现在这个样子

@db = Mysql2::Client.new(connectionstring) 

@case_number   = @db.escape(self.case_number) 
@style_of_case   = @db.escape(self.style_of_case) 

@db.query("insert into lead_to_processes (case_number, style_of_case) VALUES 
(#{@case_number}, #{@style_of_case}) 

任何意见或指导?我也试着用''封装我插入的变量

+0

你得到任何错误?你可以发布他们吗?你有写数据库的权限吗?或只读? – Mischa 2013-04-09 13:24:37

+0

我不相信mysql2 gem提供了对查询的绑定,你必须自己创建有效的SQL来传递给查询。 https://github.com/brianmario/mysql2 – mguymon 2013-04-09 13:35:40

+0

你能粘贴抛出的异常吗? – Egalitarian 2013-04-09 13:39:19

回答

0

是否有可能缺少结束报价?

@db.query("insert into lead_to_processes (case_number, style_of_case) VALUES 
(#{@case_number}, #{@style_of_case}) 

应该

@db.query("insert into lead_to_processes (case_number, style_of_case) VALUES 
(#{@case_number}, #{@style_of_case}") <== notice the quote at the end. 
+0

感谢您的回复,发布的答案,因为你发布这个,数据中有垃圾字符这是导致错误。感谢@Karl的帮助 – Austio 2013-04-09 19:50:58

1

我想有在我的代码一些奇怪的字符,所以我不得不强迫UTF-8编码,然后使用GSUB下方拆下的人物,一切现在正在流动。

谢谢你的建议

@db.escape(self.style_of_case.force_encoding("UTF-8")) 
@db.escape(self.case_number.gsub(/[\xC2]/,'').gsub(/[\xA0]/,'').force_encoding("UTF-8"))