我有一个数组,我正在尝试加载到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")
答案 0 :(得分:8)
使用inspect
和join
:
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"' % i
是String 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,您将了解它的易用性,并想知道您为何以其他方式完成此任务。