Groovy Sql 中的参数化字段名称
Parameterized field names in Groovy Sql
我有一个小工具可以对数据库执行一些简单的操作。它根据 运行 toString
在 GString
上传递给它的配置(包括字段名称)将 SQL 查询放在一起。最近我一直在尝试摆脱 GString
并使用更安全的参数化查询功能。问题是我的可配置字段名称似乎不起作用。考虑这段代码:
import groovy.sql.Sql
Sql.withInstance('jdbc:comdb2://dev/brpcfgdb?comdb2dbname=comdb3db') { Sql sql ->
sql.rows('SELECT * FROM docs WHERE :sourceFld IS :source', [sourceFld: 'source', source: 'www']).forEach { row ->
println row
}
println "----------"
sql.rows('SELECT * FROM docs WHERE source IS :source', [source: 'www']).forEach { row ->
println row
}
}
我希望在虚线上方和下方打印完全相同的行。相反,之前没有打印任何行,下面打印了预期的数字。
是否可以在参数化查询中指定字段名称? 或者我是否坚持连接 and/or GString
s?
无法传递参数化的 table 和列名称 - jdbc 驱动程序不支持此功能。
可以动态构建 sql,但可能会导致 sql 注入漏洞。
您可以通过以下代码完成:
def sourceFld = 'surce'
sql.rows('SELECT * FROM docs WHERE ${sourceFld} IS :sourceVal', [sourceVal: 'www']).forEach { row ->
println row
}
或
Map params = [
source: 'www'
]
String query = 'SELECT * FROM docs WHERE ' + params.collect{k,v-> "$k = :$k" }.join(' AND ')
sql.rows(query,params).forEach { row ->
println row
}
我有一个小工具可以对数据库执行一些简单的操作。它根据 运行 toString
在 GString
上传递给它的配置(包括字段名称)将 SQL 查询放在一起。最近我一直在尝试摆脱 GString
并使用更安全的参数化查询功能。问题是我的可配置字段名称似乎不起作用。考虑这段代码:
import groovy.sql.Sql
Sql.withInstance('jdbc:comdb2://dev/brpcfgdb?comdb2dbname=comdb3db') { Sql sql ->
sql.rows('SELECT * FROM docs WHERE :sourceFld IS :source', [sourceFld: 'source', source: 'www']).forEach { row ->
println row
}
println "----------"
sql.rows('SELECT * FROM docs WHERE source IS :source', [source: 'www']).forEach { row ->
println row
}
}
我希望在虚线上方和下方打印完全相同的行。相反,之前没有打印任何行,下面打印了预期的数字。
是否可以在参数化查询中指定字段名称? 或者我是否坚持连接 and/or GString
s?
无法传递参数化的 table 和列名称 - jdbc 驱动程序不支持此功能。
可以动态构建 sql,但可能会导致 sql 注入漏洞。
您可以通过以下代码完成:
def sourceFld = 'surce'
sql.rows('SELECT * FROM docs WHERE ${sourceFld} IS :sourceVal', [sourceVal: 'www']).forEach { row ->
println row
}
或
Map params = [
source: 'www'
]
String query = 'SELECT * FROM docs WHERE ' + params.collect{k,v-> "$k = :$k" }.join(' AND ')
sql.rows(query,params).forEach { row ->
println row
}