从数组中删除方括号?

时间:2014-01-09 21:56:06

标签: ruby tiny-tds

我有一个数组,我正在尝试加载到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")

2 个答案:

答案 0 :(得分:8)

使用inspectjoin

sql = "INSERT INTO my_table VALUES(#{rows[i].map{|x| x.inspect}.join(', ')})"
  • map在数组的每个元素上调用一个块,然后将该元素设置为块的返回值
  • inspect将字符串转换为其表示形式(如"the string"(周围带引号))
  • join将它们与
  • 之间的分隔符放在一起

答案 1 :(得分: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的主要胜利是它删除了代码与数据库使用的语言的紧密依赖关系。仔细阅读它支持的list of databases,无需在代码中更改连接所需的DSN之外的任何内容。

  

Sequel目前拥有适用于ADO,Amalgalite,CUBRID,DataObjects,DB2,DBI,Firebird,IBM_DB,Informix,JDBC,MySQL,Mysql2,ODBC,OpenBase,Oracle,PostgreSQL,SQLAnywhere,SQLite3,Swift和TinyTDS的适配器。< / p>

注意,列出了TinyTDS。

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

仔细阅读网站的第一页以及the README,您将了解它的易用性,并想知道您为何以其他方式完成此任务。