2

我有一个试图加载到 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")
4

2 回答 2

8

使用inspectjoin

sql = "INSERT INTO my_table VALUES(#{rows[i].map{|x| x.inspect}.join(', ')})"
  • map对数组的每个元素调用一个块,然后将该元素设置为该块的返回值
  • inspect将字符串转换为其表示形式(例如"the string"(用引号括起来))
  • join将它们全部放在一起,中间有一个分隔符
于 2014-01-09T21:58:27.797 回答
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是一个用双引号括起来的字符串format

话虽如此,如今与数据库通信的正确方法是使用体面的 ORM。Ruby 有几个,其中我喜欢Sequel。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。

通读该站点的第一页以及README,您将了解它的易用性,并想知道为什么要以其他方式完成它。

于 2014-01-10T01:27:46.690 回答