【发布时间】:2017-04-20 07:00:08
【问题描述】:
我正在尝试运行一些特定于 postgres 的 sql,并希望在 Exposed 中重用事务管理。
【问题讨论】:
标签: kotlin ktor kotlin-exposed
我正在尝试运行一些特定于 postgres 的 sql,并希望在 Exposed 中重用事务管理。
【问题讨论】:
标签: kotlin ktor kotlin-exposed
Exposed 有 Transaction.exec(String) 方法,它可能会做你想要的。见https://github.com/JetBrains/Exposed/blob/master/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/mysql/MysqlTests.kt
【讨论】:
在 Kiskae 的回答的帮助下,我能够运行原始 sql:
transaction {
val conn = TransactionManager.current().connection
val statement = conn.createStatement()
val query = "REFRESH MATERIALIZED VIEW someview"
statement.execute(query)
}
【讨论】:
kotlin executeQuery.close() statement.close() conn.close()
createStatement() 在 exposed 0.31.1 上不存在。
import java.sql.*
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.*
fun getAccId(db : Database, acc_domain: String) {
transaction(db) {
addLogger(StdOutSqlLogger)
var acc_id: Long = 0
exec("select id from accounts where domain = '${acc_domain}'") { rs ->
while(rs.next()) {
acc_id = rs.getLong("id")
}
}
println("Acc Id is ${acc_id}")
}
}
val database = Database.connect(datasource)
getAccId(database,"mytest.test.io")
【讨论】:
这里是一个带参数的例子:
transaction(database) {
val conn = TransactionManager.current().connection
val query = "update user set name = ? where id = ?";
val statement = conn.prepareStatement(query, false)
statement.fillParameters(listOf(Pair(VarCharColumnType(), "Laura"),
Pair(IntegerColumnType(), 3)));
statement.executeUpdate()
}
【讨论】:
您可以创建一个简单的辅助函数,例如:
String.execAndMap(transform : (ResultSet) -> T) : List {
val 结果 = arrayListOf()
TransactionManager.current().exec(this) { rs ->
而(rs.next()){
结果 += 变换(rs)
}
}
返回结果
}
"select u.name, c.name from user u inner join city c where blah blah".execAndMap { rs ->
rs.getString("u.name") 到 rs.getString("c.name")
}
取自:https://github.com/JetBrains/Exposed/wiki/FAQ#q-is-it-possible-to-use-native-sql--sql-as-a-string
【讨论】: