2013-02-03 55 views
3

我想在Anorm的SQL查詢中的表中插入多個值。在下面的代碼片段中,是否有一種方法將用戶名列表綁定爲值而不是隻有一個用戶名?將多個值插入到含有規範的表中

SQL("insert into users (username) " + 
     "values ({username})").on(
     'username -> username, 
    ).executeUpdate() 

作爲替代方案,我可以創建從我輸入一個連接字符串,但這是容易SQL注入,是不是很乾淨。

回答

0

你想重複插入命令的所有值?

如何在foreach包裹它:

usernames.foreach(username => 
    SQL("insert into users (username) " + 
    "values ({username})").on(
    'username -> username, 
).executeUpdate()) 

或者諸如此類的東西。

ANORM是一個相對簡單的庫 - 看看這裏的代碼: https://github.com/playframework/Play20/tree/master/framework/src/anorm/src/main/scala/anorm

+1

他想對一個多重插入在一個請求(爲了優化,我想),就像'插入到用戶(用戶名)VALUES'julien','clara','paul')' –

+0

是的,我想這是一種可能性。 Anorm不知道你正在執行插入操作,所以它不知道如何做這種事情。這並不複雜。 –

+0

沒錯,我正在尋找一種方法來一次插入多個值,就像@JulienLafont建議的那樣。似乎沒有任何需要的東西,所以我將自己創建sql查詢字符串。 – user1766788

3

的可能方式插入一次多個值,使用ANORM:

var fields: List[String] = Nil 
var values: List[(String,ParameterValue[_])] = Nil 

for ((username,i) <- usernames.zipWithIndex) { 
    fields ::= "({username%s})".format(i) 
    values ::= ("username" + i, username) 
} 

SQL("INSERT INTO users (username) VALUES %s".format(fields.mkString(","))) 
    .on(values: _*) 
    .executeUpdate() 
+0

我猜我使用的anorm版本有所改變;我需要做'var values:List [NamedParameter] = Nil'作爲'ParameterValue'不帶類型參數,'.on(values:_ *)'似乎無法從元組列表中找到一個隱式轉換。鑑於此,它是一種享受,應該是被接受的答案。 –

+0

2.6.X https://playframework.com/documentation/2.6.x/ScalaAnorm#Batch-update對此有新的支持 – mienaikoe

相關問題