Koenig, man prepared statements.
Сравни:
let total = try!(try!(conn.prepare("SELECT COUNT(*) FROM table WHERE id = $1")).execute(&[&id])).iter().next().unwrap().get(0);
и:
$total = $conn->query('SELECT COUNT(*) FROM table WHERE id = :id', [':id' => $id])->fetchColumn();
Что читабельнее?
reaper, а разве в пхп оно так? мне пых больше читается, но информации в первой записи больше
вроде же prepare->execute->fetch
Koenig, Там лишних ни о чём не говорящих телодвижений больше. Вот сам смотри: iter().next().unwrap().get(0). Ты можешь не зная контекста сказать, что тут происходит? Получаем итератор, переходим к первому элементу, получаем его значение или паникуем, если там ничего нет, получаем какой-то элемент из какой-то структуры по индексу 0. А нахрена всё это? fetchColumn же ясно говорит, что мы получаем какую-то колонку. Вероятно за fetchColumn скрывается примерно такая же логика, как и в первом варианте, но писанины гораздо меньше и шансов понять, что происходит гораздо больше.
# Koenig (21.04.2016 / 15:39)
вроде же prepare->execute->fetch
Можно сразу query писать. Загляни в мануал. Я это из своего старого проекта скопипастил и адаптировал немного.
reaper, да я первым делом глянул
http://php.net/manual/ru/pdo.query.php
только там другое
Так-то лучше. Макросы рулят и педалят.
Композиция кстати тоже. Можно вот так просто взять и реализовать нужные методы для структуры из какой-нибудь библиотеки. При этом видимы они будут только при условии, что типаж был заимпортирован, в отличии от каких нибудь рубей, где это
работает через жопу своего рода обезьяний патчинг, из-за чего потом велика вероятность, что придётся искать, какой же мудак добавил какой-то метод в некоторый тип (стандартной) библиотеки и теперь всё сломалось.
extern crate postgres;
use postgres::rows::Rows;
use postgres::types::FromSql;
trait FetchColumn {
fn fetch_column<T: FromSql>(&self) -> T;
}
impl <'a> FetchColumn for Rows<'a> {
fn fetch_column<T: FromSql>(&self) -> T {
self.iter().next().map(|row| row.get(0)).unwrap()
}
}
reaper, А что делает try?
Второй вариант конечно лучше.