为 Diesel "insertable" 结构指定生命周期参数有什么好处

What is the benefit of a specifying a lifetime parameter for Diesel "insertable" structs

从 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的指定了一个lifetime参数。但是,"in the wild" 当我在 github 上阅读真实示例时,我看到的每个可插入结构都省略了生命周期参数,而是定义了类似的结构:

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

就数据库性能而言,一种方法是否优于另一种方法?如果我以一种或另一种方式进行,我会 运行 遇到问题吗?

您所展示的示例之间的主要区别不在于存在生命周期注释:在一种情况下,要插入的值属于 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 有必要拥有要插入的值,即使这样做确实需要一份副本。