【问题标题】:What different between default and clientDefault function in Exposed?Exposed 中的 default 和 clientDefault 函数有什么不同?
【发布时间】:2019-10-10 04:07:04
【问题描述】:

我在 Kotlin 项目中使用 Exposed 库。 在我的表声明中,我有一个这样的列:

val updatedDate = datetime("updated_dt").clientDefault { DateTime.now() }

如果我默认替换clientDefault函数有什么不同:

val updatedDate = datetime("updated_dt").default(DateTime.now())

我看过这两个函数的源代码,但还是不知道。

clientDefault函数:

fun <T:Any> Column<T>.clientDefault(defaultValue: () -> T): Column<T> {
        this.defaultValueFun = defaultValue
        this.dbDefaultValue = null
        return this
    }

default函数:

fun <T:Any> Column<T>.default(defaultValue: T): Column<T> {
        this.dbDefaultValue = SqlExpressionBuilder.run {
            asLiteral(defaultValue)
        }
        this.defaultValueFun = { defaultValue }
        return this
    }

【问题讨论】:

    标签: kotlin kotlin-exposed


    【解决方案1】:

    通常的区别是(仅通过您引用的代码):

    1. default 只接受固定的T,会生成DEFAULT SQL 子句;

    2. clientDefault 接受一个生成T 的函数(因此它可以为不同的行返回不同的结果)并且不生成DEFAULT

    所以default(DateTime.now()) 几乎肯定不是你想要的;它会生成类似于 DEFAULT "2019-10-10T..." 的内容,并带有它被调用的日期时间,而不是 DEFAULT NOW()

    【讨论】:

    • 谢谢!但是为什么default 不能为不同的行返回不同的结果呢?我已经尝试过了,但它总是为所有行返回相同的结果?
    • 正是因为它被定义为不这样做。它采用单个值并让defaultValueFun 在调用时返回该值。如果你想问为什么它是这样定义的,你必须问作者。
    • 另外,有一个单独的 defaultNow() 函数是有意义的,但我不知道它是否存在。
    • 无论何时调用datetime("updated_dt").default(DateTime.now()),虽然DateTime.now()的值每次都不一样,但它仍然总是返回一个相同的值?
    • 不,当然。但稍后访问该表时不会调用它。
    猜你喜欢
    • 2023-03-10
    • 2020-01-21
    • 2020-10-05
    • 1970-01-01
    • 2022-06-10
    • 2021-10-19
    • 2012-11-14
    相关资源
    最近更新 更多