2

从diesel.rs 文档中,我看到了以下示例:

#[derive(Insertable)]
#[table_name="users"]
pub struct NewUser<'a> {
    pub first_name: &'a str,
    pub last_name: &'a str,
    pub email: Option<&'a str>,
 }

#[derive(Insertable)]
#[table_name="posts"]
pub struct NewPost<'a> {
    pub title: &'a str,
    pub body: &'a str,
}

事实上,每个官方示例都为 Insertable 指定了一个生命周期参数。但是,当我在 github 上阅读真实示例时,“在野外”看到的每个 Insertable 结构都省略了生命周期参数,而是定义了类似的结构:

#[derive(Insertable)]
#[table_name = "users"]
pub struct CreateUser {
    first_name: String,
    last_name: String,
    role: i16,
}

在数据库性能方面,一种方法是否比另一种方法有优势?如果我以一种或另一种方式做,我会遇到问题吗?

4

1 回答 1

2

您展示的示例之间的主要区别不在于存在生命周期注释:在一种情况下,要插入的值由Insertable结构拥有,而在另一种情况下则不拥有。

在这种情况下:

#[derive(Insertable)]
#[table_name="users"]
pub struct NewUser<'a> {
    pub first_name: &'a str,
    pub last_name: &'a str,
    pub email: Option<&'a str>,
 }

使用生命周期进行注释的要求是字段是字符串切片这一事实的结果,这些切片是对某些其他结构或变量拥有的字符串的引用。结构的NewUser持续时间不能超过拥有字符串的变量。它本质上是这些其他变量的视图,它允许您将它们的内容插入到数据库中,而无需制作任何数据副本。

另一方面:

#[derive(Insertable)]
#[table_name = "users"]
pub struct CreateUser {
    first_name: String,
    last_name: String,
    role: i16,
}

这个结构拥有字符串,所以生命周期不会进入它。

至于哪种方法是最好的方法——这取决于整个程序的数据结构。如果要插入的字段已经存在于程序维护的其他数据结构中,那么使用第一种形式可能是合适的,因为您可以避免对值进行不必要的复制。

另一方面,也许程序没有任何单独的数据结构可以保留值,或者生命周期问题使得必须Insertable拥有要插入的值,即使这确实需要复制。

于 2019-11-03T02:27:39.987 回答