Size: a a a

2020 October 15

G

George in Rust Beginners
И если туда просто прокинуть executor и использовать его в тех же местах, где x, то:
1. мы не можем использовать функцию. т.к. делаем всё вручную
2. всё равно не компилируется из-за ошибки борроуинга в месте использования функции
источник

E

Eugene in Rust Beginners
George
Коннекшены нельзя копировать. Они не Clone и не Copy.
а User::from_row() что принимает?
источник

G

George in Rust Beginners
Eugene
а User::from_row() что принимает?
источник

E

Eugene in Rust Beginners
а x.fetch_one() что возвращает?
источник

G

George in Rust Beginners
PgRow, который имплементит Row.
источник

E

Eugene in Rust Beginners
User::from_row() копирует то, что по ссылке получает?
источник

G

George in Rust Beginners
Eugene
User::from_row() копирует то, что по ссылке получает?
Не знаю. Реализация скрыта за дерайвом. FromRow дерайвится.
источник

G

George in Rust Beginners
Судя по докам, в дерайве просто идёт try по всем полям структуры из столбца.
/// This trait can be derived by SQLx for any struct. The generated implementation
/// will consist of a sequence of calls to [`Row::try_get`] using the name from each
/// struct field.
источник

G

George in Rust Beginners
А к чему это? Проблема же с заимствованием коннекшена. По факту в .transaction он даёт сам  себя и ставит баунды, чтобы он пережил это, а также он должен пережить и свой результат. Баунд 'f висит на исходящей из него BoxFuture и передаваемой ему функции, 'c на коннекшене.
источник

E

Eugene in Rust Beginners
он требует именно &mut или &  достаточно?
x: &sqlx::postrgres::PgConnection
источник

G

George in Rust Beginners
.transaction требует &'c mut self
x.execute требует self
x.fetch_one требует self
источник

E

Eugene in Rust Beginners
George
.transaction требует &'c mut self
x.execute требует self
x.fetch_one требует self
а сам closure обязательно должен быть async?
источник

G

George in Rust Beginners
Eugene
а сам closure обязательно должен быть async?
Да. Там же запросы в базу...
источник

АГ

Алексей Герасимов... in Rust Beginners
я подозреваю он говорит что входной параметр (ссылка на коннэкшон) должен пережить футуру, у футуры лайфтайм ‘2
источник

E

Eugene in Rust Beginners
George
Да. Там же запросы в базу...
а если сделать простой closure вместо async, а внутри этого closure обернуть в async-блоки запросы в базу?
источник

G

George in Rust Beginners
Eugene
а если сделать простой closure вместо async, а внутри этого closure обернуть в async-блоки запросы в базу?
Нельзя использовать async внутри обычных блоков же. Только всякое block_on-подобное.
источник

G

George in Rust Beginners
Как-то слишком много непоняток из-за двух лайфтаймов всего. Может кто уже работал с транзакциями в sqlx? @diaevd ?
(да простят меня за тэганье по имени)
источник

АГ

Алексей Герасимов... in Rust Beginners
https://github.com/rustasync/team/issues/19
может это ограничение компилятора?
источник

E

Eugene in Rust Beginners
George
Нельзя использовать async внутри обычных блоков же. Только всякое block_on-подобное.
fn bar() -> impl Future<Output = u8> {
   // This async block results in a type that implements
   // Future<Output = u8>.
   async {
       let x: u8 = foo().await;
       x + 5
   }
}
источник

АГ

Алексей Герасимов... in Rust Beginners
Eugene
fn bar() -> impl Future<Output = u8> {
   // This async block results in a type that implements
   // Future<Output = u8>.
   async {
       let x: u8 = foo().await;
       x + 5
   }
}
у него проблема в том, что лайфтайм футуры зависит от лайфтайма аргумента async-функции, раст это выводить корректно не умеет (AFAIK), а указать руками этого тоже нельзя
источник