2014-01-09 274 views
1

我有一个数组,我试图加载到SQL语句。当我编译SQL语句并包含数组时,它还将[]括号放入字符串中,我需要将它们删除才能将其插入到我的数据库中。从数组中删除方括号?

这里是我的代码:

i = 0 

while i < rows.length 
    sql = "INSERT INTO my_table VALUES(#{rows[i]})" 
    puts sql 
end 

电流输出:

INSERT INTO my_table VALUES(["value 1", "value 2", "value 3"]) 

所需的输出:

INSERT INTO my_table VALUES("value 1", "value 2", "value 3") 

回答

7

使用inspectjoin

sql = "INSERT INTO my_table VALUES(#{rows[i].map{|x| x.inspect}.join(', ')})" 
  • map调用一个阵列的每个元件上的块,则设置一个元件到块
  • inspect的返回值变成一个字符串转换为它的表示(如"the string"(与它周围的引号))
  • join用分隔符把他们都聚集在
  • 之间
+0

哦,你是我的英雄先生!我一直试图使用join(','),但它给了我一个错误。谢谢!可以在10分钟内接受答案。 – hyphen

+1

不要使用'inspect',这是一个非常容易出错的方式来完成一个非常简单的问题。在调试过程中检查对象时,可以覆盖'inspect'以提供自定义输出,这会影响您正在查找的输出。 –

+0

@theTinMan然后你会建议什么呢?另外,我不知道你为什么要重写'inspect'的字符串... – Doorknob

2

这里就是你所看到的:

ary = ['value 1', 'value 2', 'value 3'] 
"#{ ary }" # => "[\"value 1\", \"value 2\", \"value 3\"]" 

这是“检查”输出,因使用Array.to_s AKA Array.inspect。看着它像我们通常看到:

puts "#{ ary }" 
# >> ["value 1", "value 2", "value 3"] 

下面是如何解决它:

sql = "INSERT INTO my_table VALUES(#{ ary.map{ |i| '"%s"' % i }.join(', ') })" 
# => "INSERT INTO my_table VALUES(\"value 1\", \"value 2\", \"value 3\")" 

puts sql 
# >> INSERT INTO my_table VALUES("value 1", "value 2", "value 3") 

'"%s"' % iString format它包装在双引号的字符串。

这就是说,现在与数据库进行通信的正确方法是使用体面的ORM。 Ruby有几个,我赞成Sequel。对于ORM,主要 win会消除代码对数据库使用的语言的紧密依赖关系。请仔细阅读它支持的list of databases,而无需在连接所需的DSN之外更改代码中的任何内容。

续集目前拥有ADO,Amalgalite,CUBRID,数据对象,DB2,DBI,火鸟,IBM_DB,Informix的,JDBC,MySQL和Mysql2,ODBC,OpenBASE的,甲骨文和PostgreSQL,SQLAnywhere的,sqlite3的,斯威夫特和适配器TinyTDS。

通知,TinyTDS上市。

迁移工作,查询工作,插入,删除,更新,一切都被抽象化,这是因为你迁移到更大/其他系统的一个巨大的胜利。您可以从本地开始使用SQLite,使用MySQL或PostgreSQL,然后切换到Oracle而无需更改代码,只需调整DSN即可。

通读本网站的第一页,以及the README,您将了解到它的使用是多么容易,并想知道为什么您以任何其他方式完成它。

+0

INSERT INTO my_table VALUES(value 1,value 2,value 3)'是无效的SQL ...你错过了'' 's。 – Doorknob

+0

Shesh。SOOOooo很容易解决。 –

+0

@ The Tin Man - 为续集增加的信息+1,我会研究它。 – hyphen