【问题标题】:Is there a way to run raw sql with Kotlin's Exposed library有没有办法用 Kotlin 的 Exposed 库运行原始 sql
【发布时间】:2017-04-20 07:00:08
【问题描述】:

我正在尝试运行一些特定于 postgres 的 sql,并希望在 Exposed 中重用事务管理。

【问题讨论】:

    标签: kotlin ktor kotlin-exposed


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      在 Kiskae 的回答的帮助下,我能够运行原始 sql:

      transaction {
           val conn = TransactionManager.current().connection
           val statement = conn.createStatement()
           val query = "REFRESH MATERIALIZED VIEW someview"
           statement.execute(query)
      }
      

      【讨论】:

      • Kiskae 的答案是死的。链接返回 404
      • 我们应该关闭我的资源吗?像那样kotlin executeQuery.close() statement.close() conn.close()
      • 过时的答案。 createStatement()exposed 0.31.1 上不存在。
      【解决方案3】:
      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")
      

      【讨论】:

      • 这种方法容易产生SQL注入,应该使用prepared statement。请参阅@Martin Pabst 答案
      【解决方案4】:

      这里是一个带参数的例子:

      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()
      }
      

      【讨论】:

        【解决方案5】:

        您可以创建一个简单的辅助函数,例如:

         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

        【讨论】:

          猜你喜欢
          • 2021-09-25
          • 2015-08-27
          • 2018-02-07
          • 2012-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-22
          • 1970-01-01
          相关资源
          最近更新 更多