有没有办法用自定义打开和关闭方法定义块/环境?目前,我有:
script {
withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) {
def sql = Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver")
sql.rows("SELECT * FROM visualization").each { row ->
println "row ${row.branch}"
}
sql.close()
}
}
我希望能够做到:
with sqlConnection() { sql ->
sql.rows("SELECT * FROM visualization").each { row ->
println "row ${row.branch}"
}
}
相应地自动打开/关闭连接的位置。我是Groovy的新手,所以它是我所关注的语法。在Python中,我会使用对象__enter__
/ __exit__
来执行此操作。
答案 0 :(得分:1)
如果我理解正确,您需要一个新方法python3.4 manage.py runserver my_domain.com:8000
执行sqlConnection()
部分吗?
您可以使用闭包参数在其他内容之前或之后执行某些操作。
withCredentials
可以像这样使用
def sqlConnection(Closure withSqlClosure) {
withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) {
Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver").withCloseable {sql ->
withSqlClosure(sql)
}
}
}
因此,在调用闭包(sqlConnection() { sql ->
sql.rows("SELECT * FROM visualization").each { row ->
println "row ${row.branch}"
}
}
)之前的所有内容都与withSqlClosure(sql)
对应,呼叫后的所有内容都是__enter__
。请注意,您需要留意异常。通常,您希望将闭包调用包装在__exit__
语句中。在这里,我使用try { ... } finally { ... }
为我们执行此操作(假设withCloseable
返回Sql.newInstance
)。
为了帮助您启用IDE并启用Closeable
,您还应添加@CompileStatic
@ClosureParams
此处def sqlConnection(
@ClosureParams(value = groovy.transform.stc.SimpleType,
options = ["your.sql.type"]) Closure withSqlClosure) {
withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) {
Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver").withCloseable {sql ->
withSqlClosure(sql)
}
}
}
是your.sql.type
的返回类型。