如何在Kotlin Exposed中将NOW()用作日期时间列值?

时间:2019-08-14 12:02:43

标签: kotlin-exposed

在PostgreSQL中,我有一个带有timestamp type列的表。我希望将其映射到datetime中的Kotlin Exposed data type(文档尚不清楚,但这是另一个问题)。

我现在的问题是:如何使用SQL文字NOW()更新/插入一个值,以便数据库服务器将时间戳设置为当前时间戳?

我目前正在尝试将其应用于Exposed DSL API中,如下所示:

object MyTable : Table() {
    val col1: Column<String> = varchar("col1", 100).primaryKey()
    val last_update: Column<DateTime?> = datetime("last_update").nullable()
}

MyTable.update ({ MyTable.col1 eq "abcd1234" }) {
    // How do I put a literal 'NOW()' here?
    it[MyTable.last_update] = ...
}

我找到了一种在暴露的源代码中声明自定义表达式的方法,如下所示:

val nowExpression = object : Expression<DateTime>() {
    override fun toSQL(queryBuilder: QueryBuilder) = "NOW()"
}

但是如何在更新/插入语句中应用它?

我发现的Kotlin单元测试:

  • 使用DateTime.now()的Kotlin端(不是我想要的),或
  • 使用现在的列默认值,然后在插入中省略该列值。在这里,我找到了文字NOW()表达式。但是,我想将该列的默认值保留为NULL。

我没有找到在DSL插入/更新中应用自定义表达式的单元测试,但是也许我遗漏了一些东西。

1 个答案:

答案 0 :(得分:1)

Insert / Update语句上有update函数,它接受Expression

MyTable.update ({ MyTable.col1 eq "abcd1234" }) { 
  it.update(MyTable.last_update, nowExpression)
}