我正在尝试使用mysql使用Groovy查询地图:
def dat = [["id": person[-1], "date" : appt]]
dat.each{ db ->
sql.eachRow(
"select * from ${Sql.expand(db)};",
{ println "\t$db ${it.mid}"} );
但是我得到一个错误:
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=10886, date=19-01-2017}' at line 1
这里似乎是什么问题?
*************************************************** ** 编辑 ******************************************** *************
我现在正在尝试将地图插入到mysql中,然后使用以下查询进行查询:
sql.execute '''DROP TABLE IF EXISTS EDSS'''
sql.execute '''
CREATE TABLE EDSS (
id INT,
Clinic VARCHAR(15),
EDSS VARCHAR(64),
item VARCHAR(64)
);
'''
sql.withBatch("INSERT INTO EDSS (id, Clinic, EDSS, item) VALUES (?,?,?,?)"){ bt ->
bt.addBatch(df)
}
def res = sql.eachRow("select * from EDSS"){ row ->
println "$row"
}
sql.eachRow
部分工作正常,即可以选择,但是在插入语句中,我似乎只是在地图中插入第一行,即
println(df):
[1025386, 20-10-2017, null, ahddkw9d9c]
[10213446, 19-04-2017, 2.5, null]
[102382, 19-04-2017, null, null]
[1628466, 19-04-2017, null, 292jdmd02d]
[1111345, 18-09-2015, unchanged, null]
但是:
println(res):
[1025386, 20-10-2017, null, ahddkw9d9c]
*********************************** 另一个编辑 *** ******************************************************
因此,尝试使用以下方法循环遍历地图df中的所有值:
sql.withBatch { stmt ->
df.each { k, v, x, y ->
stmt.addBatch("INSERT INTO EDSS (study_id, Clinic, EDSS, NHS) VALUES ('$k', '$v', '$x', '$y')")
}
}
导致:
groovy.lang.MissingMethodException: No signature of method: sql$_run_closure1$_closure2$_closure4.doCall() is applicable for argument types: (java.lang.String) values: [1025386]
我习惯了R,这里一切都很好并且被矢量化了。如果有人能提供全部帮助,那将是很棒的事情!
答案 0 :(得分:1)
我在这里看到的内容:
您正在尝试插入 java.util.ArrayList [[val11, val12,...],[val21, val22,...]]
。您几乎快要完成尝试了。
注意:在评论小工具中已经提到了该答案。我只是想显示代码。
答案:
def df = [
[1025386, '20-10-2017', null, 'ahddkw9d9c'],
[10213446, '19-04-2017', 2.5, null],
[102382, '19-04-2017', null, null],
[1628466,'19-04-2017', null, '292jdmd02d'],
[1111345, '18-09-2015', 'unchanged', null]
]
sql.withBatch("INSERT INTO EDSS (id, Clinic, EDSS, item) VALUES (?,?,?,?)"){ bt ->
df.each { row ->
bt.addBatch (row) // <==== Answer Line
}
}
sql.eachRow("select * from EDSS"){ row ->
println "$row"
}
说明:
变量bt
实际上是BatchingPreparedStatementWrapper
对象。参见groovy document
因此addBatch()
方法可以接受这些类型List<Object>
或Object[]
。
输出:
[id:1025386, Clinic:20-10-2017, EDSS:[null], item:ahddkw9d9c]
[id:10213446, Clinic:19-04-2017, EDSS:2.5, item:[null]]
[id:102382, Clinic:19-04-2017, EDSS:[null], item:[null]]
[id:1628466, Clinic:19-04-2017, EDSS:[null], item:292jdmd02d]
[id:1111345, Clinic:18-09-2015, EDSS:unchanged, item:[null]]