我有一个数组,我试图加载到一个SQL语句中。当我编译SQL语句并包含数组时,它还将[]括号放入字符串中,我需要删除它们,以便将它们插入到我的DB中。
这是我的密码:
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")发布于 2014-01-09 21:58:27
使用inspect和join
sql = "INSERT INTO my_table VALUES(#{rows[i].map{|x| x.inspect}.join(', ')})"map对数组的每个元素调用一个块,然后将该元素设置为块的返回值。inspect将字符串转换为它的表示形式(如"the string" (其周围有引号))join将它们与中间的一个分隔符放在一起。发布于 2014-01-10 01:27:46
你现在看到的是:
ary = ['value 1', 'value 2', 'value 3']
"#{ ary }" # => "[\"value 1\", \"value 2\", \"value 3\"]"这是由使用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是一个用双引号包装字符串的format。
总之,现在与数据库通信的正确方法是使用一个像样的ORM。Ruby中有几个,其中我更喜欢续集。ORM的主要优势在于它消除了代码与数据库使用的语言的密切依赖。阅读它支持的数据库清单,而不需要更改您的代码中需要连接的DSN之外的任何内容。
Sequel目前为ADO、Amalgalite、CUBRID、DataObjects、DB2、DBI、Firebird、IBM_DB、Informix、JDBC、MySQL、Mysql2、ODBC、OpenBase、Oracle、PostgreSQL、SQLAnywhere、SQLite3、Swift和TinyTDS提供了适配器。
注意,TinyTDS是列出的。
迁移工作,查询工作,插入,删除,更新,一切都是抽象的,这是一个巨大的胜利,因为你迁移到更大的/其他系统。您可以从本地的SQLite开始,使用MySQL或PostgreSQL,然后切换到Oracle而不需要更改代码,只需调整DSN即可。
与自述一起阅读网站的第一页,您将了解它的使用有多容易,并想知道为什么您会以其他方式这样做。
https://stackoverflow.com/questions/21032044
复制相似问题