1

在 PostgreSQL 中,我有一个包含timestamp类型列的表。我希望这映射到Kotlin Exposed 数据类型datetime文档不清楚,但这是另一个问题)。

我现在的问题是:如何使用 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] = ...
}

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

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

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

我发现的 Kotlin 单元测试:

  • 使用 Kotlin 方面的DateTime.now()(不是我想要的),或者
  • 使用现在的列默认值,然后在插入中省略列值。这是我找到文字NOW()表达的地方。但是,我想在该列上保持我的默认值为 NULL。

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

4

1 回答 1

2

插入/更新语句上有update接受Expression.

MyTable.update ({ MyTable.col1 eq "abcd1234" }) { 
  it.update(MyTable.last_update, nowExpression)
}
于 2019-08-16T12:21:26.180 回答