2014-01-09 272 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