Есть ли способ запустить raw sql с библиотекой Exposed Kotlin
Я пытаюсь запустить некоторые sql специфичные для postgres и хотел бы повторно использовать управление транзакциями в Exposed.
2 ответа
Решение
С помощью ответа Kiskae я смог запустить raw sql:
transaction {
val conn = TransactionManager.current().connection
val statement = conn.createStatement()
val query = "REFRESH MATERIALIZED VIEW someview"
statement.execute(query)
}
Выставленный имеет Transaction.exec(String)
метод, который, вероятно, делает то, что вы хотите. См. https://github.com/JetBrains/Exposed/blob/master/src/test/kotlin/org/jetbrains/exposed/sql/tests/mysql/MysqlTests.kt
Вот пример с параметрами:
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()
}
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")
Вы можете создать простую вспомогательную функцию, например:
String.execAndMap (преобразование: (ResultSet) -> T): List { val результат = arrayListOf () TransactionManager.current (). Exec(это) {rs -> while (rs.next()) { результат += преобразование (rs) } } вернуть результат } "выберите u.name, c.name от пользователя u внутреннее соединение с городом c, где бла-бла".execAndMap {rs -> rs.getString ("u.name") в rs.getString ("c.name") }