2013-06-24 71 views
0

我一直在努力一段時間來獲得批量插入在我的Rails設置中工作。我收到以下錯誤消息。批量插入Rails SQLite

的SQLite3 ::的SQLException:近 「」:語法錯誤: INSERT INTO令牌(article_id的,算, '出身', 'created_at', '的updated_at', '令牌')VALUES(42,1,」標題','2013-06-24 11:54:31 +0400','2013-06-24 11:54:31 +0400','5'),(42,1,'Title','2013- 06-24 11:54:31 +0400','2013-06-24 11:54:31 +0400','公司'),(42,1,'Title','2013-06-24 11:54 :31 +0400','2013-06-24 11:54:31 +0400','To'),(42,1,'Title','2013-06-24 11:54:31 +0400', '2013-06-24 11:54:31 +0400','看'),(42,1,'Title','2013-06-24 11:54:31 +0400','2013-06-24 11:54:31 +0400','In'),(42,1,'Title','2013-06-24 11:54:31 +0400','2013-06-24 11:54:31 + 0400','Big Data')

當我將上面的SQL字符串粘貼到SQLite pl用於Firefox的ugin並執行查詢,它工作正常。所以我認爲應該有一個問題,我在Rails中如何使用這個字符串。

我有以下設置。

  • 紅寶石2.0
  • 滑軌3.2.13
  • sqlite3的1.3.7
  • Ubuntu的12.04

這裏是做大量上傳方法。它需要2個參數。 1包含每個令牌的字符串標記和數字計數的哈希。第二個參數只是一個字符串。

該方法在Article類的實例上調用。所以self.id只是文章ID。

我也嘗試了通過activerecord-import gem進行批量上傳,並且它也失敗了,並且出現了與語法相似的錯誤消息。

def token_list(names,originvar) 
    vec =[] 

    names.each do |i, count| 
    time = Time.now 
    vec << "(#{self.id},#{count},'#{originvar}','#{time}','#{time}','#{i}')" 
    end 

    raw_sql = "INSERT INTO tokens (article_id,count,'origin','created_at','updated_at','token') VALUES #{vec.join(", ")}" 

    Token.connection.execute(raw_sql) 
end 

在此先感謝。

+0

可能重複[是否有可能在SQLite數據庫一次插入多行?(http://stackoverflow.com/questions/1609637/is-it-it-it-it-insert-in-an-sqlite-database) – Matchu

+0

(我知道它不是*很愚蠢,因爲這個問題不涉及Rails ,但SQLite語法的核心問題是相同的,一旦解決了,OP應該不需要Rails位的幫助。) – Matchu

+0

另外,現在開始吧!你當前的代碼,如果它是適當的SQLite語法,將超級SQL注入(或者,如果你不擔心,因爲這是一個內部唯一的東西,超脆弱的漏洞缺乏逃逸)。考慮以另一種方式構建查詢。 – Matchu

回答

0

我想你應該在這裏使用單引號:

raw_sql = "..... VALUES #{vec.join(', ')}"