指定Diesel“可插入”结构体的生命周期参数有什么好处?

3

我看到了来自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,
}

在数据库性能方面,两种方法是否有优劣之分?如果我采用其中一种方法,是否会遇到问题?


2
我个人不太熟悉 diesel,但我认为这些示例仅仅是展示了一种可能更有效的插入数据的方法:如果您已经在内存中有 String 实例,您可以仅传递它们的切片而不是克隆它们。 - apetranzilla
1个回答

3
你所展示的例子之间的关键区别并不在于是否有生命周期注释,而在于一种情况下要插入的值由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拥有要插入的值,即使这样做需要进行复制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接