Ключевое различие между примерами, которые вы показали, заключается не в том, что существует аннотация времени жизни: это то, что в одном случае вставляемые значения принадлежат структуре 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
необходимо владеть значениями, которые должны быть вставлены, даже если это делает копию необходимой.