В чем преимущество указания параметра времени жизни для дизельных «вставляемых» конструкций - PullRequest
1 голос
/ 02 ноября 2019

Из документов 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's. Тем не менее, «в дикой природе», когда я читаю реальные примеры на github, каждая вставляемая структура, которую я вижу, пропускает параметр времени жизни и вместо этого определяет аналогичные структуры:

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

Есть ли выгода для одного подходапо сравнению с другими с точки зрения производительности базы данных? Могу ли я столкнуться с проблемами, если я сделаю это так или иначе?

1 Ответ

1 голос
/ 03 ноября 2019

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

...