Есть ли способ запустить 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") 
    } 

Взято из: https://github.com/JetBrains/Exposed/wiki/FAQ

Другие вопросы по тегам